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

标签 c++ io char ifstream

<分区>

我正在从一个输入文件“input.txt”中读取,该文件具有字符串“ABCDEFGH”,并且我正在一个字符一个字符地读取它。我正在使用代码执行此操作:

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

打印出字符串“ABCDEFGHH”。我不知道为什么要打印两次“H”。任何帮助,将不胜感激。我从 HERE 得到了这个代码示例

最佳答案

这是因为 EOF 测试并不意味着“我们的 Crystal 球告诉我们这个流中没有更多可用的字符”。相反,它是我们在输入操作失败后应用的测试,以确定输入失败是由于数据用完 (EOF) 还是其他一些情况(某种 I/O 错误)。

换句话说,即使我们成功读取了最后一个字符,EOF 也可能为假。然后我们再尝试读取,这次get会失败,并且不会覆盖ch的现有值,所以它仍然持有H.

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

关于c++ - eof() 两次返回最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32644351/

相关文章:

c++ - std::ws 应该在文件末尾引发 failbit 吗?

c++ - 如何使用 Qt 发送 REST 调用?

c++ - 保存图形到EEPROM,通过过滤器重复0x00和0xFF压缩图形以节省空间

c++ - 如何在 C++ 中读取 UTF-8 文件数据?

在Java代码中使用Weka CSVLoader时出现Java IO异常

java - java中如何将char(0-9)转换为int?

c++ - boost::xtime nsec 在 Ubuntu 上只给出 1 秒的分辨率

multithreading - 在 goroutine 中执行 I/O 时,Go 会阻塞当前线程吗?

java - Java中如何将char类型转换为boolean类型?

c - 带有 %d 和 %c 的 char scanf 的不同答案