C++ 添加尾随空格和使用eof时的额外输出
我在Microsoft Visual Studio 2013下编译以下代码C++ 添加尾随空格和使用eof时的额外输出,c++,ifstream,eof,C++,Ifstream,Eof,我在Microsoft Visual Studio 2013下编译以下代码 #include <iostream> #include <fstream> using namespace std; int main() { ifstream in("filename.txt"); int n; while (!in.eof()) { in >> n; cout << n << e
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream in("filename.txt");
int n;
while (!in.eof()) {
in >> n;
cout << n << endl;
}
return 0;
}
注意:第二行是空行
我得到以下输出:
4
4
我的问题是:在文件末尾添加尾随空格或空行时,为什么输出中重复了
4
?为什么在这种情况下,eof
不能正常工作 您没有检查操作的状态。即使>>n中的代码>设置失败状态(因此n未设置为新值),执行下一行。参见或类似。您的文件在eof之前有一个空行,因此您可以在while循环中运行代码两次。以下是执行上述代码时发生的情况:
1st loop iteration:
read 4 into n
output n (4)
2nd loop iteration:
read EOF
(here there is no test for EOF)
output n (4)
3rd loop iteration (doesn't happen, because EOF was read during the last read)
您应该在循环条件中测试
中的状态:
while (in >> n)
{
// all is good, carry on
}
使用!eof()
,!fail()
,!坏()
,或!good()
,总是用错误的方式来调节输入。关键是首先执行提取,然后检查是否成功。如果你做前者,你几乎总是会遇到你正在经历的问题
对n
的第一次提取从流中获得4
。找到换行符后,它停止运行,您打印了n
的值。执行第二个循环时,提取器清除流中的前导空格(表示4
之后的换行符),找到流的结尾并设置eofbit
。由于未提取任何字符,因此它还设置了failbit
。当您再次尝试打印该值时,所看到的只是上一次输入操作的结果
这不是执行读取的正确方法。您必须在检查流之前执行此操作。通常是这样做的:
while (in >> n)
{
std::cout << n << std::endl;
}
while(在>>n中)
{
当文件中只有一个“4”时,输出中是否只有一个4?(没有空格…)
while (in >> n)
{
std::cout << n << std::endl;
}