在最后一行阅读后调用feof()是否有效?

时间:2016-01-19 23:17:57

标签: c

我只是使用以下语句读取字符串:

fgets(string, 100, file);

刚读入的这个字符串是最后一行。如果我现在拨打feof()它会返回TRUE吗?是否与在阅读任何行之前在开始时调用feof()相同?

3 个答案:

答案 0 :(得分:3)

  

feof()在最后一行读完后调用了吗?

     

没有

阅读过去数据结尾时,

feof()成为现实。如果最后一行以'\n'结束,则读取最后一行可能无法通过数据结尾。

答案 1 :(得分:2)

不,请勿使用feof()来检测文件的结尾。而是检查读取失败,例如fgets()如果尝试读取文件末尾将返回NULL,而feof()将返回0,直到某些函数尝试读取超过文件末尾,之后才返回非零值。

答案 2 :(得分:2)

简短的回答是。原因如下:

如果fgets成功读取了行尾的'\n',则FILE结构中的文件结束指示符尚未设置。因此,feof()将返回0,就像在阅读任何内容之前一样,即使在空文件上也是如此。

feof()只能在输入操作失败后用于区分文件结束和读错误条件。同样,ferr()可用于在输入操作失败后检查读取错误。

程序员通常会忽略文件结束和读取错误之间的区别。因此,它们仅依赖于检查输入操作是成功还是失败。因此,他们从不使用feof(),你也应该这样做。

行为与errno的行为有些相似:errno由某些库函数设置,以防出现错误或失败。成功后,它不会重置为0。在函数调用之后检查errno仅在操作失败时才有意义如果errno在函数调用之前被清除为0

如果要检查是否确实已到达文件,则需要尝试读取额外输入。例如,您可以使用此功能:

int is_at_end_of_file(FILE *f) {
    int c = getc(file);
    if (c == EOF) {
        return 1;
    } else {
        ungetc(c, file);
        return 0;
    }
}

但是,如果从控制台读取,读取额外输入可能不值得:它将要求用户输入将保留在输入流中的额外输入。如果从管道或设备读取,副作用可能更成问题。唉,没有可移植的方法来测试FILE流是否与实际文件相关联。