为什么在循环条件(即`while(!stream.eof())`)内的iostream :: eof被认为是错误的? [英] Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?
问题描述
我刚刚在此答案表示,在循环条件中使用 iostream :: eof
几乎肯定是错误的。我通常使用 while(cin>> n)
之类的东西-我猜它隐式检查EOF。
I just found a comment in this answer saying that using iostream::eof
in a loop condition is "almost certainly wrong". I generally use something like while(cin>>n)
- which I guess implicitly checks for EOF.
为什么使用 while(!cin.eof())
显式检查eof是错误的?
Why is checking for eof explicitly using while (!cin.eof())
wrong?
与在其中使用 scanf( ...,...)!= EOF
有何不同? C(我经常会毫无问题地使用它)?
How is it different from using scanf("...",...)!=EOF
in C (which I often use with no problems)?
推荐答案
因为 iostream :: eof
在读取流的结尾之后仅返回 true
。它不会不表示,下一个读取将是流的结尾。
Because iostream::eof
will only return true
after reading the end of the stream. It does not indicate, that the next read will be the end of the stream.
考虑一下(并假设下一个读取将位于流的结尾):
Consider this (and assume then next read will be at the end of the stream):
while(!inStream.eof()){
int data;
// yay, not end of stream yet, now read ...
inStream >> data;
// oh crap, now we read the end and *only* now the eof bit will be set (as well as the fail bit)
// do stuff with (now uninitialized) data
}
对此:
int data;
while(inStream >> data){
// when we land here, we can be sure that the read was successful.
// if it wasn't, the returned stream from operator>> would be converted to false
// and the loop wouldn't even be entered
// do stuff with correctly initialized data (hopefully)
}
关于第二个问题:因为
if(scanf("...",...)!=EOF)
是相同的as
if(!(inStream >> data).eof())
,不与
if(!inStream.eof())
inFile >> data
这篇关于为什么在循环条件(即`while(!stream.eof())`)内的iostream :: eof被认为是错误的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!