为什么 iostream::eof 在循环条件(即`while (!stream.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?
它与在 C 中使用 scanf("...",...)!=EOF
有什么不同(我经常使用没有问题)?
How is it different from using scanf("...",...)!=EOF
in C (which I often use with no problems)?
推荐答案
因为 iostream::eof
只会返回 true
after流的结尾.它不表示,下一次读取将是流的结尾.
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)
}
关于你的第二个问题:因为
And on your second question: Because
if(scanf("...",...)!=EOF)
与
if(!(inStream >> data).eof())
和不与
if(!inStream.eof())
inFile >> data
这篇关于为什么 iostream::eof 在循环条件(即`while (!stream.eof())`)中被认为是错误的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!