C++ 添加尾随空格和使用eof时的额外输出

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

我在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 << 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;
}