fopen()返回一个NULL指针,但该文件肯定存在

时间:2011-07-13 22:10:55

标签: c visual-studio-2008 pointers null fopen

我的代码如下:

FILE *txt_file = fopen("data.txt", "r");
if (txt_file == NULL) {
    perror("Can't open file");
} 

返回的错误消息是:

  

无法打开文件:没有此类文件或目录

文件'data.txt'肯定存在于工作目录中(它存在于包含我的.c和.h文件的目录中),那么为什么fopen()返回一个NULL指针?

7 个答案:

答案 0 :(得分:12)

标准问题。尝试

FILE *txt_file = fopen("C:\\SomeFolder\\data.txt", "r");

即。尝试先用完整的绝对路径打开它;如果它工作,那么你只需要找出当前目录与_getcwd()的对应关系,然后修复你的相对路径。

答案 1 :(得分:8)

文件名是否可能不是“data.txt”?

在Unix上,文件名实际上是字节字符串而不是字符串,并且可以在名称中创建带有控件(如退格)的文件。我曾经看过过去复制粘贴到终端导致文件具有普通名称的情况,但是尝试打开目录列表中出现的文件名会导致错误。

确定文件名确实是您认为的文件名的一种方法:

$ python
>>> import os
>>> os.listdir('.')

答案 2 :(得分:3)

我的问题是我有一个文件filename.txt而且我没有意识到实际上它是filename.txt.txt,因为windows没有显示扩展名。

答案 3 :(得分:2)

确保输入文件与可执行文件位于同一目录中,该目录可能与保存源文件的目录不同。如果您在IDE调试器中运行该程序,请确保将您的工作目录设置为输入文件的位置。此外,如果您在* nix而不是Windows中运行,则可能需要在输入文件名前加上“./”。

答案 4 :(得分:2)

文件名中不可见的SPACE字符?

每年一次,我遇到类似的问题: 我尝试在字符串中打开一个文件名,从sting操作中获取。当我打印名称似乎没问题,但fopen()返回一个空指针。唯一的帮助是使用分隔符打印名称,显示文件名字符串的确切开头和结尾。当然,这对不可打印的字符没有帮助。

答案 5 :(得分:0)

我刚遇到类似的问题,我知道路径正确且文件位于正确的位置。检查文件权限。程序可能无法访问该文件,因为它正在获得权限被拒绝。

答案 6 :(得分:0)

我遇到了同样的错误,要在Linux上从Windows损坏的脚本文件中打开文件。

ENOENT 2没有这样的文件或目录

Windows(或某些其他Microsoft罪魁祸首)上的写字板将CRLF =(0x0D,0x0A)插入了我的Linux脚本文件中,而不是newline = LF = 0x0A。当我将文件名读入缓冲区并由于看不见的附加CR字符而失败时调用fopen时。

在Linux Mint上的Codelite编辑器中,我能够显示EOL字符(“查看”>“显示EOL”),并通过查找和替换来删除它们,使用从损坏的脚本文件中复制并粘贴CRLF,从未损坏的文件中复制并粘贴LF。进入文本字段。