【问题标题】:fopen() returning a NULL pointer, but the file definitely existsfopen() 返回一个 NULL 指针,但文件确实存在
【发布时间】:2011-10-04 21:43:50
【问题描述】:

我的代码如下:

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

返回的错误信息是:

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

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

【问题讨论】:

  • 您是从命令行还是从 IDE 执行?如果是IDE,你确定程序的工作目录设置为包含数据文件的目录吗?
  • 您可以将ls -Fal 的输出添加到相关目录吗?
  • 您可能没有打开它的权限。你在linux上吗?
  • 你能附上整个代码吗?
  • 您可以使用 _getcwd() 函数获取当前工作目录,用于调试和学习 Visual Studio 运行程序的工作目录。

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


【解决方案1】:

标准问题。试试

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

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

【讨论】:

    【解决方案2】:

    文件名可能不是真正的“data.txt”吗?

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

    一种确定文件名是否真的如您所想的方法:

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

    【讨论】:

    • 您的意思是文件名可以是“data.txt”,文件扩展名为“.txt”?意味着文件全名可能是“data.txt.txt”?
    • 原来是这样的。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 没有理由在 UNIX 上将 ./ 添加到传递给 fopen() 的文件名之前。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          我在 Linux 上从一个被 Windows 损坏的脚本文件中遇到了相同的 errno。

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

          Windows 上的写字板(或其他 Microsoft 罪魁祸首)将 CRLF = (0x0D, 0x0A) 插入到我的 linux 脚本文件中,以代替换行符 = LF = 0x0A。当我将文件名读入缓冲区并调用 fopen 如果由于不可见的附加 CR 字符而失败。

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

          【讨论】:

            猜你喜欢
            • 2011-08-24
            • 1970-01-01
            • 1970-01-01
            • 2014-07-09
            • 2017-10-19
            • 1970-01-01
            • 2014-03-10
            • 1970-01-01
            • 2021-06-24
            相关资源
            最近更新 更多