Возвращаемое значение ifstream.peek() при достижении конца файла

Я просматривал эту статью на Cplusplus.com, http://www.cplusplus.com/reference/iostream/istream/peek/

Я до сих пор не уверен, что возвращает функция peek(), если она достигает конца файла.

В моем коде часть программы должна работать до тех пор, пока это утверждение истинно.

(sourcefile.peek() != EOF)

где исходный файл - это мой ifstream.

Однако он никогда не прекращает цикл, даже если достиг конца файла.

Разве EOF не означает «конец файла»? Или я неправильно его использовал?


person superlazyname    schedule 14.09.2010    source источник
comment
почему ты выглядываешь? Почему бы просто не прочитать и посмотреть, не сработает ли это.   -  person Martin York    schedule 15.09.2010


Ответы (4)


Консультации по Стандарту,

Возвращает:traits::eof() еслиgood()являетсяfalse. В противном случае возвращаетrdbuf()->sgetc().

Что касается sgetc(),

Возвращает: Если позиция чтения входной последовательности недоступна, возвращает underflow().

И underflow,

Если ожидающая последовательность равна нулю, функция возвращает traits::eof(), чтобы указать на ошибку.

Так что да, возвращает EOF в конце файла.

Проще сказать, что он возвращает int_type. Поскольку значения int_type - это только значения char_type плюс EOF, он, вероятно, вернул бы char_type, если бы EOF был невозможен.

Как уже упоминалось, peek не продвигает позицию в файле. Как правило, проще и лучше просто зациклиться на while ( input_stream ) и позволить неудаче получить дополнительный ввод убить процесс синтаксического анализа.

person Potatoswatter    schedule 15.09.2010

Вещи, которые приходят на ум (не видя вашего кода).

  • EOF может быть определено иначе, чем вы ожидаете
  • sourcefile.peek() не перемещает указатель файла. Вы как-то продвигаете его вручную или, возможно, постоянно смотрите на одного и того же персонажа?
person T.E.D.    schedule 14.09.2010
comment
Я нашел проблему, на самом деле это не имело никакого отношения к моему циклу while, самое последнее чтение искало «/ n», но не нашло, потому что это был конец файла. Я должен был вставить что-то там, чтобы остановить его, если это был конец файла. - person superlazyname; 15.09.2010

EOF предназначен для старых функций в стиле C. Вы должны использовать istream::traits_type::eof().

Изменить: просмотр комментариев убедил меня, что istream::traits_type::eof() гарантированно возвращает то же значение, что и EOF, если только случайно EOF не было переопределено в контексте вашего исходного блока. Хотя совет все еще в порядке, это не ответ на опубликованный вопрос.

person Mark Ransom    schedule 14.09.2010
comment
::eof() возвращает EOF для char_traits<char>, который является одним из istream. - person Johannes Schaub - litb; 15.09.2010
comment
Несмотря на то, что T.E.D мне очень помог, Марк ответил на вопрос вверху страницы, поэтому я выбираю его в качестве принятого ответа. Спасибо за помощь ребята! - person superlazyname; 15.09.2010
comment
@jwaffe обратите внимание, что он не ответил на ваш вопрос. Его попытка решить вашу проблему не удалась, потому что EOF всегда равно istream::traits_type::eof(). Это экземпляр meta.stackexchange.com/questions/64308/try-xyz-answers. . (я дебил, но меня это устраивает). - person Johannes Schaub - litb; 15.09.2010
comment
@Johannes, требуется ли, чтобы eof() возвращал EOF, или это просто общепринятое соглашение? - person Mark Ransom; 15.09.2010
comment
@jwaffe, вам не нужно выбирать ответ, особенно если ни один из ответов не решил вашу проблему. Возможно, еще не поздно отменить мой ответ, потому что я убежден, что это на самом деле не помогло. - person Mark Ransom; 15.09.2010
comment
Стандарт говорит, что член eof() возвращает EOF (для версии char), а член eof() возвращает WEOF (для версии wchar_t). - person Johannes Schaub - litb; 15.09.2010
comment
В защиту Марка (на самом деле я его единственный голос), я мог легко увидеть, где из-за неудачных #include или чего-то еще EOF мог закончиться #define чем-то другим. Вот куда попала моя первая пуля. Так что его совет хорош ИМХО. - person T.E.D.; 15.09.2010
comment
@ТЕД. конечно, я думаю, что это хороший совет использовать eof(), я согласен. Но на самом деле ответ звучит для меня как «Это не удается, потому что вы используете EOF». Вам нужно использовать istream::traits_type::eof(), который имеет правильное значение - person Johannes Schaub - litb; 15.09.2010
comment
Итак, EOF является синонимом istream::traits_type::eof()? - person superlazyname; 15.09.2010

person    schedule
comment
Ответы только на код не самые лучшие - попробуйте добавить объяснение. - person random_user_name; 18.11.2012