C中的FILE指针不返回NULL

时间:2014-07-23 04:56:41

标签: c linux file

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

这是一段非常简单的代码,我正在尝试打开一个文件,而该文件不存在。我想根据需要处理这个错误并继续移动,但是当我尝试将它与NULL进行比较时,文件指针会产生分段错误...请参阅下面的代码:

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

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

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

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

3 个答案:

答案 0 :(得分:4)

if(file == NULL)行不会导致您的程序崩溃。如果你使用像gdb这样的调试器,它会显示确切的崩溃位置,这是在其他地方。

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

答案 1 :(得分:2)

您还需要:

#include <stdio.h>

如果不这样做,在C89 fopen被视为返回int,当您将其转换为FILE *并取消引用时会导致未定义的行为。您应该收到编译器警告。

在C99中,此代码是非法的,但如果您没有以符合模式调用,则编译器可能无论如何都要通过它。

答案 2 :(得分:0)

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