C ++ - 为什么cin.eof()读取最后一次char两次?

时间:2012-11-12 12:48:03

标签: c++ eof cin

  

可能重复:
  Why is iostream::eof inside a loop condition considered wrong?


我有一个非常简单的问题......

#include<iostream>
using namespace std;
int main()
{
    char x;
    while(!cin.eof())
    {
        cin>>x;
        cout<<"char: "<< x << endl;
    }
    return 0;
}


为什么当我尝试在Linux上运行此代码时:
./file_name&lt; test_file.txt
结果是:
char:a char:b
char:c
char:d
char:d
当test_file.txt只有:
ABCD

3 个答案:

答案 0 :(得分:10)

无法输入操作检测到文件结尾。

所以,在

    cin>>x;
    cout<<"char: "<< x << endl;

即使输入操作失败,也会执行输出语句。

当它失败时,它不会更新x

不是测试.eof(),而是测试.fail()

您可以直接将流对象用作条件,例如

#include<iostream>
using namespace std;
int main()
{
    char x;
    while( cin >> x )
    {
        cout<<"char: "<< x << endl;
    }
}

此处,表达式cin >> x执行可能更新x的输入操作,并且其表达式结果返回对流的引用,即cin 。所以cin被直接用作条件。这将调用转换为boolean,boolean被定义为使其本身等同于!cin.fail()(即表达式cin >> x,因为条件等同于写!(cin >> x).fail()或者作为逗号表达式,(cin >> x, !cin.fail()))。

答案 1 :(得分:2)

您使用稍微错误的模式从文件中读取。正确的形式是

while(cin >> x) {
    cout<<"char: "<< x << endl;
}

请注意,eof告诉您是否尝试阅读输入结尾;如果您即将这样做,它不会告诉您。您的原始代码第一次读取d,看到它没有尝试读取结束,然后再次尝试读取。此读取失败,但您现在处于循环中,并且x具有上一次迭代中的值d,因此它再次打印。

上面的代码在尝试读入x之后测试流的状态(顺便说一下,它不仅会捕获文件结尾而且还会发现错误);因此,在第一次读取失败后,循环将不会被执行。

答案 2 :(得分:-1)

你必须使用带文件大小的for循环来避免使用null char