我正在运行一个从文件读取文本的exe文件,该文件与exe保存在同一目录中。 我正在使用_tfopen函数,它返回errno 2,这意味着文件丢失。 如前所述,文本文件与exe在同一目录中,因此我只使用文本文件的文件名而不是整个路径(即使我试图使用绝对文件路径......)。 我正在从另一台计算机运行exe,而不是我正在开发的计算机(发布版本)。
使用相同文件的另一个应用程序也可以在同一目录中完美运行。
为什么exe不能找到文本文件?
FILE* fileData;
if ((fileData = _tfopen(_T("Data.txt"), _T("r"))) == NULL)
return false;
答案 0 :(得分:2)
您可能想尝试这样做:让您的程序调用{{1}}并将结果输出到某处,以确认程序的当前目录是否符合您的想法。如果您在调试器下运行,则可以使用GetCurrentDirectory()
;如果不是,则可以使用OutputDebugString()
。
当我需要确定我打开一个共同定位的文件时,我调用MessageBox()
来获取EXE文件的FQN,剥离EXE文件名并添加文件名I需要。这样,我没有做任何可能错误的假设 - 毕竟,使用快捷方式设置与包含EXE文件的目录不同的程序的默认目录是微不足道的。
此外,如果您通过输入程序的完整路径从命令行运行程序,那么程序的当前目录就是您运行它时所在的目录,不那个目录EXE被发现了。如果通过搜索GetModuleFileName( NULL, szExeFqn, sizeof(szExeFqn))
环境变量找到您的程序也是如此(是的,它仍然存在于Windows中。)
以下是我用了十多年时间用来做你所描述的事情的例子:
PATH
最终结果是与EXE位于同一位置的帮助文件的名称。除非缺少帮助文件(或者其权限被某种方式进行了搜索),否则这总是有效的。我从来没有按照“偏执狂”的路径,评论说“我放弃了。”
答案 1 :(得分:1)
通常操作系统根据当前目录而不是可执行位置打开具有相对地址的文件。
例如,如果您的可执行文件位于/path/to/exec/executable
并且您从/path/to/invoke
调用它,它将尝试打开Data.txt
,就像它是/path/to/invoke/Data.txt
一样。
您可以查看this question及其答案,了解如何在Windows中查找可执行文件的路径。或this answer用于各种其他操作系统。
答案 2 :(得分:0)
即使没有指定完整路径,它也应该工作。您是否从Visual Studio启动可执行文件?如果是,请确保Data.txt文件位于* .vcxproj文件或* .sln文件所在的项目目录中。