2012-11-12 612 views
3

可能重复:
Why is iostream::eof inside a loop condition considered wrong?C++ - 为什么cin.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
结果是:
炭:一个
炭:乙
炭:C
炭:d
炭:d
当test_file.txt只是:
abcd

+2

参见[为什么的iostream :: EOF算错了一个循环条件里面?](http://stackoverflow.com/questions/5605125/why-是-iostreameof-内,一个循环条件考虑的,是错误的) –

+0

因为它总是错,错,错用'EOF()'都没有。现在有成千上万的重复,如果一个问题不是重复的,它仍然包含相同的错误... grumble grumble抱怨 –

回答

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被直接用作条件。调用转换到布尔值,它被定义为使得其自身相当于!cin.fail()(即,作为条件表达式cin >> x相当于写入!(cin >> x).fail(),或作为逗号表达式,(cin >> x, !cin.fail()))。

2

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

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

记住eof告诉你如果你已经尝试读取过去的输入结束;它不会告诉你是否正要这样做。您的原始代码第一次读取d,发现它没有尝试读取结尾,然后尝试再次读取。此读取失败,但您现在处于循环中,并且x的值为上一次迭代的值d,所以它再次打印。

上述代码测试流的状态(其将顺便不仅赶上档案结尾而且错误)后它已试图读入x;因此在第一次读取失败后,循环将不会执行。

-1

您必须循环使用与文件大小,以避免空字符

相关问题