3

可能重复:
为什么循环条件内的 iostream::eof 被认为是错误的?


我有一个很简单的问题...

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


为什么当我尝试在 Linux 上运行此代码时:
./file_name < test_file.txt
结果是:
char: a
char: b
char: c
char: d
char: d
当 test_file.txt 仅为:
abcd

4

3 回答 3

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,并作为其表达式结果返回对流的引用,即 to cin。所以cin被直接用作条件。这会调用到布尔值的转换,该布尔值被定义为它本身等价于!cin.fail()(即,cin >> x作为条件的表达式等价于写作!(cin >> x).fail(),或者,作为逗号表达式,(cin >> x, !cin.fail()))。

于 2012-11-12T12:53:18.977 回答
2

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

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

请记住,它会eof告诉您是否尝试读取输入末尾的内容;它不会告诉您是否即将这样做。您的原始代码d第一次读取,发现它没有尝试读取结尾,然后尝试再次读取。此读取失败,但您现在位于循环内并x具有d上一次迭代的值,因此再次打印。

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

于 2012-11-12T12:51:04.457 回答
-1

您必须使用文件大小的 for 循环来避免空字符

于 2012-11-12T13:19:06.227 回答