c++ eof()的一个典型问题

如题所述

第1个回答  2024-08-18
在C++编程中,eof()函数是一个常用的工具,最近在Stack Overflow上看到了一个相关的问题,下面是详细的描述。

问题描述如下:有一个名为ex.txt的文本文件,里面只包含三个字母,占据一行。具体内容如下:

当编写代码去读取这个文件时,如果使用eof()函数,会发现读到一个额外的字母,输出时显示为-1;但使用inf >> c的方式,则能得到正确的结果。以下是问题中的代码示例:

我运行代码后的结果如下:

问题的核心在于为什么会多输出一个-1。

关于eof()函数:eof用于判断,返回布尔值。根据cplusplus.com的说明,当流的eofbit错误状态标志被设置(表示上一次输入操作已到达文件末尾)时,返回true,否则返回false。

即,当eofbit被置为1时,返回true,否则返回false。

对于第一节的问题,可以这样解释:按照常规理解,如果到达文件末尾,eofbit应该被置为1,此时inf.eof()应返回真。但输入输出流在判断是否到达文件末尾时出现了问题:他们的依据是,只有当inf.get()无法读取数据时,才会判断到达了文件末尾,此时才会把eofbit置为1,此时inf.eof()才会返回真。问题就在这里,如果inf.get()已经读取了最后一个数据(abc中的c),此时的状态是读取到了数据,所以eofbit仍然是假,inf.eof()也是假。只有下一次再读取数据,没有数据可读,返回EOF,eofbit被置为1,inf.eof()返回真,但此时输出了返回的EOF,所以多输出了一个-1,这就是第一节代码中的问题。

至于inf >> c为什么不会出错,可以这样理解:inf >> c在还没有到达文件末尾时,返回对象本身,即inf(非零值);当遇到EOF输入时,返回值为0,循环结束,不会多输出一个-1。
相似回答