除非在那里探索,否则Fopen会返回null?

时间:2013-02-07 01:23:17

标签: c null fopen explorer

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

我正在使用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。

这里发生了什么?如果我在浏览器中打开窗口时运行它,为什么只能找到它?

1 个答案:

答案 0 :(得分:0)

如果没有路径组件的裸文件名,

fopenopen等将尝试在“当前目录”中打开命名文件。给定没有文件系统根目录的文件名,它将尝试在目录 relative 中打开该文件到当前目录。只有在给定绝对(完整)路径时,它才能准确显示您告诉它的位置。

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

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

  • 在Windows资源管理器中导航到程序(让我们说WORD.EXE)并双击它 - 当前目录很可能是程序所在的目录 - 您导航的位置(但没有标准说这必须是这样的)
  • 导航到项目的文档,然后双击Word文档,自动启动WORD.EXE - 当前目录是什么?它可能就是文件的所在。
  • 从“开始”菜单启动WORD.EXE - 现在的目录是什么?
  • 从调试器启动程序 - now 当前目录是什么?

最后一点是为什么你必须告诉IDE /调试器在启动程序时使用什么作为当前目录。

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

。然后将该文件的完整路径传递给该程序