从当前位置搜索零重置eof标志

时间:2012-02-27 13:21:38

标签: c++ istream

根据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?

1 个答案:

答案 0 :(得分:1)

问题是你正在滥用eof():这个标志的唯一用途是确定你上次读取是否失败,因为你到达了文件的末尾(好吧,它甚至不会这样做)公平:即使设置eof()可能不是真正的原因,尽管它可能是)。要确定流状态,请使用转换为bool

while (in) ...

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

N3168是标准化委员会讨论的论文。副手我不知道它所讨论的特定主题,除了它是对国家身体缺陷报告的回应。