2011-10-06 16 views

risposta

22

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.

+4

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

+0

@Frank: Grazie, modificato. Suppongo che non si possa operare su un flusso fallito del tutto, il che ha senso. –

+0

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

4

Presumibilmente si intende su un iostream. In questo caso, lo stream clear() dovrebbe eseguire il lavoro.

2

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