eof()返回最后一个字符两次

时间:2015-09-18 05:14:39

标签: c++ io char ifstream

我正在读取输入文件“input.txt”,其中包含字符串'ABCDEFGH',我在char中通过char读取它。我这样做是使用代码:

ifstream plaintext (input.txt);
char ch;
if (plaintext.is_open())
{
    while(!plaintext.eof()){
        plaintext.get(ch);
        cout<<ch<<endl;
    }
    plaintext.close();
}

打印出字符串'ABCDEFGHH'。我不知道它为什么两次打印'H'。任何帮助,将不胜感激。我从HERE

获得了这个代码示例

1 个答案:

答案 0 :(得分:1)

这是因为EOF测试并不意味着&#34;我们的水晶球告诉我们这个tream中没有更多可用的角色&#34;。相反,它是在输入操作无法确定输入是否由于数据耗尽(EOF)或某些其他条件(某种类型的I / O错误)而失败后应用的测试。

换句话说,即使在我们成功读取了最后一个字符之后,EOF也可能是假的。然后我们会再次尝试阅读,这次get会失败,而不会覆盖ch的现有值,因此它仍然保留H

Streams无法预测数据的结束,因为它们不能用于通信设备,如串行线路,交互式终端或网络套接字。在终端上,我们无法判断用户是否输入了他们将要键入的最后一个字符。在网络上,我们无法判断我们刚收到的字节是最后一个字节。相反,我们知道 previous 字节是最后一个,因为当前的读操作失败了。