我打开了一个文件,在指针ptr
的地址找到了该流。我试图查看文件是否为空。使用以下
if (fgetc(ptr) != EOF)
按预期工作。当文件为空时,不执行该语句。当文件不为空时,不执行该语句。
然而,使用
if (!feof(ptr))
总是执行声明。
为什么会这样?有没有办法使用feof
函数?
答案 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
检查尝试读取或超过文件末尾的读取后的文件结束指示符集。在不控制的代码正在从文件中读取,并且您希望在文件耗尽后停止处理的情况下,它非常有用。