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

问题描述 投票:17回答:7

我的代码如下:

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

返回的错误消息是:

无法打开文件:没有这样的文件或目录

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

c visual-studio-2008 pointers null fopen
7个回答
9
投票

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

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

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

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

12
投票

标准问题。尝试

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

即尝试先用完整的绝对路径打开它;如果它工作,那么你只需要弄清楚_getcwd()当前目录是什么,然后修复你的相对路径。


3
投票

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


2
投票

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


2
投票

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

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


0
投票

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


0
投票

我从Linux损坏的脚本文件中遇到了与Linux相同的错误。

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

Windows上的Wordpad(或其他一些微软罪魁祸首)将CRLF =(0x0D,0x0A)插入到我的linux脚本文件中,代替newline = LF = 0x0A。当我将文件名读入缓冲区时,如果由于隐藏的附加CR字符而失败则调用fopen。

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

© www.soinside.com 2019 - 2024. All rights reserved.