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

查看:32
本文介绍了为什么 iostream::eof 在循环条件(即`while (!stream.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?

它与在 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屋!

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