请参阅当前位置的零重置eof标志

seekg zero from current position resets eof flag

本文关键字:零重 eof 标志 位置 请参阅      更新时间:2023-10-16

根据GCC 4.6.2 istream.tcc:

basic_istream<_CharT, _Traits>::
seekg(off_type __off, ios_base::seekdir __dir)
{
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // DR60.  Do not change _M_gcount.
  // Clear eofbit per N3168.
  this->clear(this->rdstate() & ~ios_base::eofbit);

我不小心碰到了这个——不明白为什么我会得到一个无限的while (!eof)循环。基本上,当使用ZERO长度调用seekg时,您仍然可以重置eof。即使对于零长度的std::ios_base_::cur搜索,也有重置eof位的原因吗?这在VC10/11中不会发生。

N3168是什么?

问题是您滥用了eof():该标志的唯一用途是确定您上次读取是否因为触及文件末尾而失败(公平地说,它甚至没有这样做:即使设置了eof(),也可能不是真正的原因,尽管它可能是)。要确定流状态,请使用到bool:的转换

while (in) ...

请注意,您仍然需要在阅读后检查阅读是否成功。

N3168是标准化委员会讨论的一篇论文。我不知道它讨论了什么特定的话题,除了它是对一份全国性身体缺陷报告的回应。