fopen()返回了空指针,但文件肯定存在

20
我有的代码如下:
FILE *txt_file = fopen("data.txt", "r");
if (txt_file == NULL) {
    perror("Can't open file");
} 

返回的错误信息是:

无法打开文件:没有那个文件或目录

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

7
你是在命令行执行还是在集成开发环境中执行?如果是在集成开发环境中执行,你确定程序的工作目录设置为包含数据文件的目录了吗? - fvu
1
你能否添加有关所讨论目录的 ls -Fal 命令的输出结果? - Fredrik Pihl
1
你可能没有打开它的权限。你是在Linux上吗? - Vinicius Kamakura
应用程序的当前目录是什么?你尝试使用绝对路径了吗?文件是否被其他人以写入方式打开?是否存在权限问题?这是哪个操作系统和文件系统? - EboMike
1
你可以使用 _getcwd() 函数获取当前工作目录,用于调试和学习 Visual Studio 运行程序的工作目录。 - nos
显示剩余4条评论
7个回答

16

标准问题。尝试

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

也就是说,首先尝试使用完整的绝对路径打开它;如果可以运行,则只需使用 _getcwd() 找出当前目录,然后修复相对路径即可。


11

文件名真的可能不是"data.txt"吗?

在Unix上,文件名实际上是字节字符串而不是字符字符串,因此可以创建具有控制字符(例如退格符)的文件名。过去我曾见过这样的情况,即将内容复制并粘贴到终端中导致出现看起来很普通的文件名,但尝试打开目录清单中显示的文件名会导致错误。

要确定文件名是否真的是您认为的名称之一的一种方法是:

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

5
您的意思是文件名可以是"data.txt",文件扩展名为'.txt'吗?这意味着文件的完整名称可以是'data.txt.txt'吗? - Barjavel
4
结果事实证明确实如此。 - Barjavel

5

我的问题在于我有一个文件filename.txt,但由于Windows系统不显示扩展名,我没有意识到它其实是filename.txt.txt。


2

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


3
在UNIX中,传递给fopen()的文件名前面不需要加./ - caf

2

文件名中的不可见空格字符?

每年我都会遇到类似的问题:我尝试使用从字符串操作获得的文件名字符串打开文件。当我打印文件名时,它看起来没问题,但是fopen()返回一个空指针。唯一有用的方法是使用分隔符打印文件名,显示文件名字符串的确切开头和结尾。当然,这对于不可打印字符并没有帮助。


0

我之前遇到过类似的问题,我知道路径是正确的,文件也在正确的位置。请检查文件权限。可能是程序无法访问该文件,因为它被拒绝了许可。


0

我在Linux上遇到了与脚本文件损坏有关的fopen相同的errno。

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

Windows上的Wordpad(或其他一些微软罪犯)将CRLF =(0x0D,0x0A)插入我的Linux脚本文件中,以代替换行符= LF = 0x0A。当我将文件名读入缓冲区并调用fopen时,由于不可见的附加CR字符而失败。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接