【发布时间】:2021-06-21 23:17:39
【问题描述】:
我刚刚在this 答案中发现了一条评论,说在循环条件中使用iostream::eof 是“几乎肯定是错误的”。我通常使用while(cin>>n) 之类的东西——我猜它会隐式检查 EOF。
为什么使用while (!cin.eof()) 显式检查eof 错误?
它与在 C 中使用 scanf("...",...)!=EOF 有什么不同(我经常使用没有问题)?
【问题讨论】:
-
scanf(...) != EOF在 C 中也不起作用,因为scanf返回成功解析和分配的字段数。正确的条件是scanf(...) < n,其中n是格式字符串中的字段数。 -
@Ben Voigt,如果达到 EOF,它将返回一个负数(通常定义为 EOF)
-
@SebastianGodelet:实际上,如果在第一次字段转换(成功与否)之前遇到文件结尾,它将返回
EOF。如果字段之间到达文件结尾,它将返回成功转换和存储的字段数。这使得与EOF的比较是错误的。 -
@SebastianGodelet:不,不是真的。当他说“通过循环,没有(简单的)方法可以区分正确的输入和不正确的输入”时,他犯了错误。事实上,它就像在循环退出后检查
.eof()一样简单。 -
@Ben 是的,对于这种情况(读取一个简单的 int)。但是可以很容易地想出一个场景,
while(fail)循环以实际失败和 eof 终止。考虑一下每次迭代是否需要 3 个整数(例如,您正在读取 x-y-z 点或其他内容),但错误地,流中只有两个整数。