可能重复:
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
答案 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