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

StackOverflow https://stackoverflow.com/questions/3712379

  •  02-10-2019
  •  | 
  •  

Вопрос

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

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

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

(sourcefile.peek() != EOF)

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

Тем не менее, это никогда не останавливает зацикливание, хотя он достиг конца файла.

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

#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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top