eof() 两次返回最后一个字符
eof() is returning last character twice
我正在从一个包含字符串 'ABCDEFGH' 的输入文件 "input.txt" 中读取,并且我正在一个字符一个字符地读取它。我正在使用代码执行此操作:
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测试并不意味着"our crystal ball tells us that there are no more characters available in this tream"。相反,它是我们在输入操作失败后应用的测试,以确定输入是否由于 运行 数据不足 (EOF) 或某些其他情况(某种 I/O 错误)而失败。
换句话说,即使我们成功读取了最后一个字符,EOF 也可能为假。然后我们再次尝试读取,这次 get
会失败,并且不会覆盖 ch
的现有值,所以它仍然持有 H
.
Streams 无法预测数据的结尾,因为那样它们就不能用于串行线路、交互式终端或网络套接字等通信设备。在终端上,我们无法判断用户是否输入了他们将要输入的最后一个字符。在网络上,我们无法判断我们刚刚收到的字节是最后一个字节。相反,我们知道 previous 字节是最后一个字节,因为当前读取操作失败。
我正在从一个包含字符串 'ABCDEFGH' 的输入文件 "input.txt" 中读取,并且我正在一个字符一个字符地读取它。我正在使用代码执行此操作:
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测试并不意味着"our crystal ball tells us that there are no more characters available in this tream"。相反,它是我们在输入操作失败后应用的测试,以确定输入是否由于 运行 数据不足 (EOF) 或某些其他情况(某种 I/O 错误)而失败。
换句话说,即使我们成功读取了最后一个字符,EOF 也可能为假。然后我们再次尝试读取,这次 get
会失败,并且不会覆盖 ch
的现有值,所以它仍然持有 H
.
Streams 无法预测数据的结尾,因为那样它们就不能用于串行线路、交互式终端或网络套接字等通信设备。在终端上,我们无法判断用户是否输入了他们将要输入的最后一个字符。在网络上,我们无法判断我们刚刚收到的字节是最后一个字节。相反,我们知道 previous 字节是最后一个字节,因为当前读取操作失败。