Возвращение значения ifstream.peek () Когда он достигнет конца файла
Вопрос
Я смотрел эту статью на 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;
}