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?
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?
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.
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.
+1 - o almeno sarà +1 in 13 minuti quando ho voti ... –
+1 - in questo momento effettivo :) –
@Billy: In realtà il tuo ritardo mi ha dato 10 rep extra da quando ero già al limite massimo fino a 10 minuti fa. –
Per quel che vale:
void skip_lines(std::istream& pStream, size_t pLines)
{
std::string s;
for (; pLines; --pLines)
std::getline(pStream, s);
}
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.
Il conteggio di newline è qualcosa che farebbe un getline in loop, giusto? – GManNickG
buono a sapersi, ottima informazione, grazie !!!! – ufk
@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) –