2014-12-06 31 views
5

mio programma legge una riga da un file di testo utilizzando:Torna una riga su un file di testo C++

std::ifstream myReadFile("route.txt"); 
getline(myReadFile, line) 

E se si trova qualcosa che sto cercando (tag) memorizza quella linea in un temp String. Non voglio continuare fino a quando non trovo qualche altro tag, se trovo un altro tag voglio poter tornare alla riga precedente in modo che il programma possa leggerlo nuovamente come un altro tag e fare qualcos'altro.

Sono stato a guardare putback() e unget() sono confuso su come usarli e se potrebbero essere la risposta corretta.

+1

Penso che ['std :: istream :: seekg'] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg) in concerto con la lunghezza della riga che hai appena letto potrebbe essere alquanto utile – WhozCraig

risposta

6

Il migliore sarebbe considerare un algoritmo a un passaggio, che memorizza in memoria ciò che potrebbe essere necessario al primo tag senza tornare indietro.

Se questo non è possibile, è possibile "segnalibro" la posizione torrente e prelevare in un secondo momento con tellg() e seekg():

streampos oldpos = myReadFile.tellg(); // stores the position 
.... 
myReadFile.seekg (oldpos); // get back to the position 

Se si leggono i tag in modo ricorsivo incorporati (html, per esempio), si potrebbe anche usare a stack<streampos> per spingere e inserire le posizioni durante la lettura. Tuttavia, tenere presente che le prestazioni vengono rallentate da tali accessi avanti/indietro.

si parla putback() e unget(), ma questi sono limitati a un char, e non sembra adatto al vostro approccio getline().

1

La cosa più semplice di gran lunga, se si vuole solo tornare indietro di una riga, è sempre quello di tenere traccia della linea che si trova su e la linea prima.

Mantenere una variabile cur che memorizza la riga corrente e prev che memorizza quella precedente. Quando si passa alla riga successiva, si copia cur in prev e si legge la nuova riga in cur.

In questo modo è sempre disponibile la riga precedente.