为什么在循环条件(即`while(!stream.eof())`)内的iostream :: eof被认为是错误的? [英] Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?

查看:159
本文介绍了为什么在循环条件(即`while(!stream.eof())`)内的iostream :: eof被认为是错误的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚在答案表示,在循环条件中使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆