поиск нуля с текущей позиции сбрасывает флаг eof - PullRequest
0 голосов
/ 27 февраля 2012

Согласно 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).В основном, когда seekg вызывается с нулевой длиной - вы все равно получаете сброс eof.Есть ли причина для сброса бита eof даже при поиске нулевой длины std::ios_base_::cur?Это не происходит в VC10 / 11.

А что такое N3168?

1 Ответ

1 голос
/ 27 февраля 2012

Проблема заключается в том, что вы злоупотребляете eof(): единственное использование этого флага - определить, не было ли последнее чтение неуспешным, потому что вы достигли конца файла (ну, это даже не делает, чтобы быть справедливым:даже если установлено eof(), это может не быть реальной причиной, хотя, вероятно, так и было).Чтобы определить состояние потока, используйте преобразование в bool:

while (in) ...

Обратите внимание, что вам все равно нужно проверить после чтения, было ли чтение успешным.

N3168 документ, обсуждаемый комитетом по стандартизацииЯ не знаю, какую конкретно тему он обсуждает, кроме того, что это было в ответ на сообщение о дефекте национального органа.

...