混淆== EOF vs feof

时间:2016-03-22 20:38:04

标签: c file pointers fgetc feof

我打开了一个文件,在指针ptr的地址找到了该流。我试图查看文件是否为空。使用以下

if (fgetc(ptr) != EOF)

按预期工作。当文件为空时,不执行该语句。当文件不为空时,不执行该语句。

然而,使用

if (!feof(ptr))

总是执行声明。

为什么会这样?有没有办法使用feof函数?

4 个答案:

答案 0 :(得分:15)

  

有没有办法使用feof功能?

是的,有。 输入函数返回一个值后,表明它没有更多要处理的输入,您可以调用feof()和/或ferror()来确定条件是否由到达输入结束或出现错误情况。

这是feof()ferror()函数的唯一有效用途。

结果表明不再有输入的输入因功能而异。例如,fgets()返回值EOF,而fread()返回的值小于请求的记录数。您需要阅读每个输入函数的文档,以了解它是如何工作的。

答案 1 :(得分:9)

在C标准库"文件末尾"不是一个独立的自我检测条件。 "文件结束"仅仅是前面的读操作的文件状态集。在您执行读取操作之前,直到该读取操作碰到文件的实际结尾," eof"未设置状态,feof()返回0.

C标准库中的许多(大多数)标准I / O函数已经返回了一些完成代码,可用于检测"文件末尾"条件(如fgetc()返回EOF值)。这意味着大多数时间调用feof()是不必要的。

换句话说,如果你考虑"文件结尾"作为一堵砖墙,在C标准库中,仅仅站在那堵墙前是不够的,以便检测它。为了发现它的存在,有必要用你的前额碰到那堵墙。

当您打开一个空文件时,您将开始处于墙前的状态""。此时"文件结束"尚未检测到条件。你必须尝试阅读某些东西才能撞到那堵墙,从而检测它的存在。

这种设计的原因是完全符合逻辑的。 C语言旨在支持各种输入流和文件系统,包括1)根本不存储文件大小的文件系统,以及2)只知道近似文件大小的文件系统(如舍入到最近的簇)。在这种文件系统中,文件末尾通常由特殊标记指定。在阅读文件时遇到标记之前,您不知道该标记的位置。 (出于同样的原因,C流不保证支持来自SEEK_END函数的fseek来源的定位。)

正如@Barmar在评论中指出的那样,没有预先确定的文件结尾的输入流的更好的例子" position是链接到终端的标准输入。

答案 2 :(得分:7)

打开文件后,

feof(f)将始终返回false,因为if为您提供了一个初始化为false的标志值,并且只有在至少一次读取操作失败后才设置为true。 / p>

答案 3 :(得分:1)

您可以像这样使用feof

fgetc(fp);
if (feof(fp))
  ...

feof检查尝试读取或超过文件末尾的读取后的文件结束指示符集。在控制的代码正在从文件中读取,并且您希望在文件耗尽后停止处理的情况下,它非常有用。