根据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?
答案 0 :(得分:1)
问题是你正在滥用eof()
:这个标志的唯一用途是确定你上次读取是否失败,因为你到达了文件的末尾(好吧,它甚至不会这样做)公平:即使设置eof()
可能不是真正的原因,尽管它可能是)。要确定流状态,请使用转换为bool
:
while (in) ...
请注意,您仍然需要在阅读后检查读取是否成功。
N3168是标准化委员会讨论的论文。副手我不知道它所讨论的特定主题,除了它是对国家身体缺陷报告的回应。