我打开了一个文件,在指针ptr的地址找到了流。我正在尝试查看一个文件是否为空白。使用以下内容
if (fgetc(ptr) != EOF)按预期工作。如果文件为空,则不会执行该语句。如果文件不是空白,则不会执行该语句。
然而,使用
if (!feof(ptr))总是执行语句。
这一切为什么要发生?有没有一种使用feof函数的方法?
发布于 2016-03-22 20:58:58
有没有一种使用
feof函数的方法?
是的,有。在输入函数返回一个指示它没有更多要处理的输入的值之后,您可以调用feof()和/或ferror()来确定条件是由于到达输入结束或某些错误条件而造成的。
这是feof()和ferror()函数的唯一有效使用。
结果表明,不同函数之间的输入不存在差异。例如,fgetc()返回值EOF,fgets()返回一个空指针,而fread()返回的值小于请求的记录数。您需要阅读每个输入函数的文档,看看它是如何工作的。
发布于 2016-03-22 20:53:57
在C标准库中,“文件结束”不是一个独立的自检测条件。“文件的结束”仅仅是由前面的读取操作设置的文件状态。在执行读取操作之前,直到读取操作遇到文件的实际结尾,"eof“状态才会被设置,并且feof()返回0。
C标准库中的许多(大多数)标准I/O函数已经返回一些可用于检测“文件结束”条件的完成代码(如fgetc()返回EOF值)。这意味着大多数时候调用feof()是不必要的。
换句话说,如果你把“文件的结尾”当作砖墙,在C标准库中,仅仅站在墙的前面去检测它是不够的。为了发现它的存在,有必要用你的额头撞上那堵墙。
当您打开一个空文件时,您将以“墙前”的状态开始。此时尚未检测到“文件结束”条件。你必须试着读一些东西,这样才能撞上那堵墙,从而探测到它的存在。
这种设计的理由是完全合乎逻辑的。C语言旨在支持各种输入流和文件系统,包括1)根本不存储文件大小的文件系统,以及2)只知道近似文件大小的文件系统(比如四舍五入到最近的集群)。在这样的文件系统中,文件的结尾通常由一个特殊的标记指定。在读取文件时遇到它时,您才知道该标记在哪里。(出于同样的原因,C流不能保证支持SEEK_END原点在fseek函数中的定位。)
正如@Barmar在评论中所指出的,一个更好的例子是一个没有预先确定的“文件结束”位置的输入流是连接到终端的标准输入。
发布于 2016-03-22 20:40:02
feof(f)总是在打开文件之后返回false,因为如果给出一个标志的值,该标志被初始化为false,并且只有在至少一个读取操作失败后才设置为true。
https://stackoverflow.com/questions/36164718
复制相似问题