0

这是一个非常奇怪的错误。

我正在使用 Visual Studio 2012,并且在 C++ 项目(作为 C 项目的容器)中,我正在以这种方式加载文件:

const char* fname = "SomeFile.csv";
if(!(fp = fopen(fname, "r")))
{
    printf("Error! Could not open %s!\n",fname);
    return;
}

CSV 与 .EXE 位于同一文件夹中,这就是该程序的目的。


1. 在调试中运行它时,它无法读取 CSV。

2. 当我输入文件的完整路径名时,它可以正常工作并加载 CSV。

3. 当我转到 Windows 资源管理器中的输出文件夹并运行 .exe 时,它​​会正确加载 CSV。

4. 现在是奇怪的部分。当我转到另一个文件夹(其他任何地方),然后将包含 .exe 的完整路径粘贴到 Windows 资源管理器中时,它会启动程序,但它无法读取 CSV。

需要注意的是,如果我在资源管理器中加载了文件夹,但在 VS2012 调试器中运行它,它也无法加载 CSV。

这里发生了什么?为什么只有在资源管理器中打开窗口时运行它才能找到它?

4

1 回答 1

0

fopen,open等将在给定没有路径组件的裸文件名的情况下尝试在“当前目录”中打开命名文件。给定一个没有文件系统根目录的文件名,它将尝试在对于当前目录的目录中打开文件。只有当给定一个绝对(完整)路径时,它才会看起来与您告诉它的位置完全相同。

在基于命令行的系统中,当前目录非常明显——它是您发出命令时所在的目录。

在图形用户界面中,当前目录的概念有点糊涂:

  • 在 Windows 资源管理器中导航到程序(比如说WORD.EXE)并双击它 - 当前目录可能是程序所在的目录 - 您导航到的位置(但没有标准表明必须如此)
  • 导航到项目的文档并双击 Word 文档,它会自动启动 WORD.EXE - 当前目录是什么?它可能是文档所在的位置。
  • 从开始菜单启动 WORD.EXE - 现在的目录到底是什么?
  • 从调试器启动你的程序——现在当前目录是什么?

最后一点是为什么您必须告诉 IDE/调试器在启动程序时将其用作当前目录的原因。

fileOpenDialog并不完全“默认”到当前目录-它打开到您上次打开它的位置,而不更改程序的当前目录-当您选择一个文件时,它会将该文件的完整路径传递给程序。

于 2013-02-07T18:15:59.477 回答