这是一个非常奇怪的错误。
我正在使用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。
这里发生了什么?如果我在浏览器中打开窗口时运行它,为什么只能找到它?
答案 0 :(得分:0)
fopen
,open
等将尝试在“当前目录”中打开命名文件。给定没有文件系统根目录的文件名,它将尝试在目录 relative 中打开该文件到当前目录。只有在给定绝对(完整)路径时,它才能准确显示您告诉它的位置。
在基于命令行的系统中,当前目录非常明显 - 它是您发出命令时所在的目录。
在图形用户界面中,当前目录的概念有点糊涂:
WORD.EXE
)并双击它 - 当前目录很可能是程序所在的目录 - 您导航的位置(但没有标准说这必须是这样的)最后一点是为什么你必须告诉IDE /调试器在启动程序时使用什么作为当前目录。
fileOpenDialog
并不完全“默认”到当前目录 - 它打开到您上次打开它的位置,而不更改程序的当前目录 - 当您选择一个时然后将其传递给该程序。