我的代码如下:
FILE *txt_file = fopen("data.txt", "r");
if (txt_file == NULL) {
perror("Can't open file");
}
返回的错误消息是:
无法打开文件:没有此类文件或目录
文件'data.txt'肯定存在于工作目录中(它存在于包含我的.c和.h文件的目录中),那么为什么fopen()返回一个NULL指针?
答案 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。进入文本字段。