【问题标题】:FILE pointer in C not returning NULL [closed]C中的FILE指针不返回NULL [关闭]
【发布时间】:2014-07-23 04:56:41
【问题描述】:

我知道这是一个经常被问到的问题,我希望这里有人可以帮助我解决这个问题...

这是一段很简单的代码,我试图打开一个文件,但该文件不存在。然后,我想根据需要处理此错误并继续前进,但是当我尝试将其与 NULL 进行比较时,文件指针创建了分段错误...请参阅下面的代码:

FILE* file = fopen(res, "r");
if(file == NULL)
{
    printf("NO CONFIG FILE");
    return 0;
}

即使 res 指向的文件不存在,在进行此比较时会发生分段错误 if(file==NULL),如果我使用 if(file==0) 也会失败。我真的在我的智慧在这里结束,任何意见将不胜感激!

这里只是一个快速更新...

当我删除代码以检查文件指针的有效性并且文件存在时,代码可以正常工作。问题似乎出在我对文件指针的评估中……

【问题讨论】:

  • if(file) 有效吗? NULL0 都转换为 false
  • 这不太可能。向我们展示完整的代码。 res 是什么?
  • 您的错误在别处。 “res”指向的字符串很可能已损坏。在这段代码之前尝试printf("%s\n", res);
  • 这是不可能的。当fopen 访问res 时,前面的语句本身有问题。确保res 是一个有效的以零结尾的字符串。
  • 不行,我试过 if(!file) 还是不行。我正在尝试测试文件不存在的情况

标签: c linux file


【解决方案1】:

if(file == NULL) 行不会使您的程序崩溃。如果您使用像 gdb 这样的调试器,它会向您显示确切的崩溃位置,也就是别处。

您可能认为发生这种情况的原因是因为您没有在printf() 调用中打印换行符。默认情况下,当 stdout 是终端时,stdout 是 line-buffered,这意味着它不会刷新,直到您打印换行符或自己使用 fflush() 显式刷新它。但是,如果您的程序在刷新之前崩溃,则任何缓冲数据都会丢失。

【讨论】:

    【解决方案2】:

    你还需要:

    #include <stdio.h>
    

    否则,在 C89 中 fopen 被认为返回 int,当您将其转换为 FILE * 并取消引用时会导致未定义的行为。您应该会收到编译器警告。

    在 C99 中,此代码是非法的,但如果您不以一致性模式调用,您的编译器可能会通过它。

    【讨论】:

      【解决方案3】:

      如果我用一些随机字符串(“abcd”)替换“res”,相同的代码在我的机器上运行得非常好。 “res”可能有问题,其余代码可以正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多