0

我正在运行一个从文件中读取文本的 exe,该文件与 exe 保存在同一目录中。我正在使用 _tfopen 函数,它返回 errno 2,这意味着文件丢失。如前所述,文本文件与 exe 位于同一目录中,因此我仅使用文本文件的文件名而不是整个路径(即使我尝试使用绝对文件路径......)。我正在从另一台计算机运行 exe,而不是我正在开发的计算机(发行版)。

另一个使用相同文件的应用程序,也在同一目录中,运行良好。

为什么exe找不到文本文件?

FILE* fileData;
if ((fileData = _tfopen(_T("Data.txt"), _T("r"))) == NULL)
    return false;
4

3 回答 3

2

你可能想试试这个:让你的程序调用GetCurrentDirectory()并将结果输出到某个地方,你可以确认程序的当前目录确实是你认为的那样。OutputDebugString()如果您在调试器下运行,或者MessageBox()不是,您可以使用。

当我需要确定我正在打开一个位于同一位置的文件时,我会调用GetModuleFileName( NULL, szExeFqn, sizeof(szExeFqn))以获取 EXE 文件的 FQN,去掉 EXE 文件名并添加我需要的文件名。这样,我就不会做出任何可能错误的假设——毕竟,为与包含 EXE 文件的目录不同的程序设置默认目录的快捷方式是微不足道的。

此外,如果您通过输入程序的完整路径从命令行运行程序,那么程序的当前目录就是您运行它时所在的目录,而不是找到 EXE 的目录。如果通过搜索环境变量找到您的程序也是如此PATH(是的,它仍然存在于 Windows 中。)

这是我十多年来用来做你所描述的事情的一个例子:

char szHelpFileName[_MAX_FNAME];
char *cp;

GetModuleFileName( NULL, szHelpFileName, sizeof(szHelpFileName) );
cp = strrchr( szHelpFileName, '\\' );
if( cp )
{
   cp++; // Point to the char just following the final slash.
}
else
{  // No backslash, is there a colon?
   cp = strrchr( szHelpFileName, ':' );
   if( cp )
   {
      cp++; // Point to the char just following the colon.
   }
   else
   {  // I give up.  I'll have no path information.
      cp = szHelpFileName;
   }
}
strcpy( cp, "program.hlp" );

最终结果是与 EXE 位于同一位置的帮助文件的名称。除非帮助文件丢失(或者它的权限被某种方式剥夺了),否则这总是有效的。我从来没有让它遵循评论说“我放弃”的“偏执狂”路径。

于 2013-03-05T13:11:34.317 回答
1

通常操作系统会根据当前目录而不是可执行位置打开具有相对地址的文件。

因此,例如,如果您的可执行文件在/path/to/exec/executable其中并且您从中调用它/path/to/invoke,它将尝试Data.txt像原来一样打开/path/to/invoke/Data.txt

您可以查看这个问题及其答案,了解如何在 Windows 中找到可执行文件的路径。或者这个答案适用于各种其他操作系统。

于 2013-03-05T13:12:27.137 回答
0

即使没有指定完整路径,它也应该可以工作。您是否从 Visual Studio 启动可执行文件?如果是,请确保 Data.txt 文件位于 *.vcxproj 文件或 *.sln 文件所在的项目目录中。

于 2013-03-05T13:25:28.023 回答