首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >== EOF与feof的混淆

== EOF与feof的混淆
EN

Stack Overflow用户
提问于 2016-03-22 20:38:03
回答 5查看 9.6K关注 0票数 13

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

代码语言:javascript
复制
if (fgetc(ptr) != EOF)

按预期工作。如果文件为空,则不会执行该语句。如果文件不是空白,则不会执行该语句。

然而,使用

代码语言:javascript
复制
if (!feof(ptr))

总是执行语句。

这一切为什么要发生?有没有一种使用feof函数的方法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-22 20:58:58

有没有一种使用feof函数的方法?

是的,有。在输入函数返回一个指示它没有更多要处理的输入的值之后,您可以调用feof()和/或ferror()来确定条件是由于到达输入结束或某些错误条件而造成的。

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

结果表明,不同函数之间的输入不存在差异。例如,fgetc()返回值EOFfgets()返回一个空指针,而fread()返回的值小于请求的记录数。您需要阅读每个输入函数的文档,看看它是如何工作的。

票数 15
EN

Stack Overflow用户

发布于 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在评论中所指出的,一个更好的例子是一个没有预先确定的“文件结束”位置的输入流是连接到终端的标准输入。

票数 10
EN

Stack Overflow用户

发布于 2016-03-22 20:40:02

feof(f)总是在打开文件之后返回false,因为如果给出一个标志的值,该标志被初始化为false,并且只有在至少一个读取操作失败后才设置为true。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36164718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档