Сброс состояния конца файла объекта ifstream в C ++ - PullRequest
17 голосов
/ 07 октября 2011

Мне было интересно, есть ли способ сбросить состояние eof в C ++?

Ответы [ 3 ]

26 голосов
/ 07 октября 2011

Для файла вы можете просто искать любую позицию. Например, чтобы перемотать в начало:

std::ifstream infile("hello.txt");

while (infile.read(...)) { /*...*/ } // etc etc

infile.clear();                 // clear fail and eof bits
infile.seekg(0, std::ios::beg); // back to the start!

Если вы уже прочитали до конца, вы должны сбросить флаги ошибок с clear(), как предлагает @Jerry Coffin.

5 голосов
/ 07 октября 2011

Предположительно, вы имеете в виду iostream.В этом случае поток clear() должен выполнить эту работу.

1 голос
/ 11 марта 2014

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

ifstream ifs("alpha.dat");       //open a file
if(!ifs) throw runtime_error("unable to open table file");

while(getline(ifs, line)){
         //......///
}

//reset the stream for another pass
int pos = ifs.tellg();
cout<<"pos is: "<<pos<<endl;     //pos is: -1  tellg() failed because the stream failed

ifs.clear();
pos = ifs.tellg();
cout<<"pos is: "<<pos<<endl;      //pos is: 7742'ish (aka the end of the file)

ifs.seekg(0);
pos = ifs.tellg();               
cout<<"pos is: "<<pos<<endl;     //pos is: 0 and ready for action

//stream is ready for another pass
while(getline(ifs, line) { //...// }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...