Возвращает значение ifstream.peek (), когда оно достигает конца файла - PullRequest
3 голосов
/ 14 сентября 2010

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

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

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

(sourcefile.peek() != EOF)

где sourcefile - мой ifstream.

Тем не менее, он никогда не останавливает цикл, даже если он достиг конца файла.

Не означает ли EOF «Конец файла»? Или я использовал это неправильно?

Ответы [ 4 ]

2 голосов
/ 15 сентября 2010

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

  • EOF может быть определено иначе, чем вы ожидаете
  • sourcefile.peek() не продвигает указатель файла. Вы каким-то образом продвигаете его вручную или постоянно смотрите на одного и того же персонажа?
2 голосов
/ 15 сентября 2010

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

Возвращает: 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 ) и допускать, что неудача при получении дополнительного ввода убивает процесс разбора.

2 голосов
/ 15 сентября 2010

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

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

0 голосов
/ 03 июля 2011
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//myifstream_peek1.cpp
int main()
{
 char ch1, ch2;
 ifstream readtext2;
 readtext2.open("mypeek.txt");
 while(readtext2.good())
 {
 if(readtext2.good())
 {
  ch2 = readtext2.get();   cout<< ch2;
 }
 }
   readtext2.close();
 //
 ifstream readtext1;
 readtext1.open("mypeek.txt");
 while(readtext1.good())
    {
    if(readtext1.good())
     {

        ch2 = readtext1.get();
        if(ch2 ==';')
            {
             ch1= readtext1.peek();
             cout<<ch1;  exit(1);
            }
            else {  cout<<ch2; }
        }

    }
    cout<<"\n end of ifstream peeking";
   readtext1.close();
return 0;
}
...