Сброс состояния конечного файла объекта ifstream в С++

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

Ответ 1

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

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.

Ответ 2

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

Ответ 3

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

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) { //...// }