Mi chiedevo se esistesse un modo per reimpostare lo stato di eof in C++?Ripristino dello stato di fine file di un oggetto ifstream in C++
risposta
Per un file, è possibile cercare in qualsiasi posizione. Ad esempio, per riavvolgere l'inizio:
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!
Se già leggere oltre la fine, è necessario ripristinare i flag di errore con clear()
come suggerisce @Jerry Coffin.
Ho provato questo, e funziona solo se 'clear' è chiamato * prima *' seekg'. Vedi anche qui: http://cboard.cprogramming.com/cplusplus-programming/134024-so-how-do-i-get-ifstream-start-top-file-again.html – Frank
@Frank: Grazie, modificato. Suppongo che non si possa operare su un flusso fallito del tutto, il che ha senso. –
Per i lettori in ritardo: in base a [riferimento cpp] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg), la cancellazione non è più necessaria poiché C++ 11 ... – Aconcagua
Presumibilmente si intende su un iostream. In questo caso, lo stream clear()
dovrebbe eseguire il lavoro.
Sono d'accordo con la risposta sopra, ma ho incontrato questo stesso problema stasera. Così ho pensato di postare del codice che è un po 'più tutorial e mostra la posizione del flusso in ogni fase del processo. Probabilmente avrei dovuto controllare qui ... PRIMA ... ho passato un'ora a capirlo da solo.
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) { //...// }
di un file ifstream. –