2010-04-05 13 views
6

Sto usando std :: getline() per leggere le righe da una classe derivata da std :: istream, come posso spostare in avanti alcune righe?Salta righe in std :: istream

Devo solo leggerli e scartarli?

risposta

9

Edit: È inoltre possibile utilizzare std :: istream :: ignore, vedere https://stackoverflow.com/a/25012566/492336


Devo usare getline il numero di righe voglio saltare?

No, ma probabilmente sarà la soluzione più chiara per chi legge il codice. Se il numero di linee che si sta saltando è grande, è possibile migliorare le prestazioni leggendo blocchi di grandi dimensioni e contando le newline in ogni blocco, fermando e riposizionando il file nella posizione dell'ultima newline. Ma a meno che tu non abbia problemi di prestazioni, metterei semplicemente getline in un ciclo per il numero di linee che vuoi saltare.

+3

Il conteggio di newline è qualcosa che farebbe un getline in loop, giusto? – GManNickG

+0

buono a sapersi, ottima informazione, grazie !!!! – ufk

+0

@GMan - Save the Unicorns: Sì, ma puoi usare blocchi più grandi e spostarti di una distanza maggiore se sai che n è grande (cioè contando più di una newline in un buffer buffer) –

8

Sì, utilizzare std::getline a meno che non si conosca la posizione delle newline.

Se per qualche strano motivo capita di sapere dove si trovano le nuove righe, è possibile utilizzare prima ifstream::seekg.

È possibile leggere in altri modi, ad esempio ifstream::read ma std::getline è probabilmente la soluzione più semplice e più chiara.

+0

+1 - o almeno sarà +1 in 13 minuti quando ho voti ... –

+2

+1 - in questo momento effettivo :) –

+0

@Billy: In realtà il tuo ritardo mi ha dato 10 rep extra da quando ero già al limite massimo fino a 10 minuti fa. –

6

Per quel che vale:

void skip_lines(std::istream& pStream, size_t pLines) 
{ 
    std::string s; 
    for (; pLines; --pLines) 
     std::getline(pStream, s); 
} 
11

No, non c'è bisogno di usare getline stringhe

Il modo più efficiente sta ignorando con std :: istream :: ignorare

for (int currLineNumber = 0; currLineNumber < startLineNumber; ++currLineNumber){ 
    if (addressesFile.ignore(numeric_limits<streamsize>::max(), addressesFile.widen('\n'))){ 
     //just skipping the line 
    } else 
     return HandleReadingLineError(addressesFile, currLineNumber); 
} 

HandleReadingLineError non è standard ma fatto a mano, naturalmente. Il primo parametro è il numero massimo di caratteri da estrarre. Se questo è esattamente numeric_limits :: max(), non ci sono limiti: collegamento a cplusplus.com: std::istream::ignore

Se avete intenzione di saltare un sacco di linee è sicuramente dovrebbe usare al posto di getline: quando ho bisogno per saltare 100000 linee nel mio file ci sono voluti circa un secondo in opposto a 22 secondi con getline.

Problemi correlati