2010-04-05 27 views
6

Estoy usando std :: getline() para leer las líneas de una clase std :: istream-derived, ¿cómo puedo avanzar algunas líneas?Omitir líneas en std :: istream

¿Tengo que leerlo y descartarlo?

Respuesta

9

Editar: También puede utilizar std :: :: istream ignorar ver https://stackoverflow.com/a/25012566/492336


¿Tengo que usar getline el número de líneas que desea saltar?

No, pero es probable que sea la solución más clara para quienes leen su código. Si el número de líneas que está omitiendo es grande, puede mejorar el rendimiento leyendo bloques grandes y contando líneas nuevas en cada bloque, deteniendo y reposicionando el archivo en la ubicación de la última línea nueva. Pero a menos que tengas problemas de rendimiento, simplemente pondré getline en un bucle para la cantidad de líneas que quieres omitir.

+3

Contando saltos es lo que haría un 'getline', ¿verdad? – GManNickG

+0

bueno saber, gran información, gracias !!!! – ufk

+0

@GMan - Guardar los unicornios: Sí, pero puede usar bloques más grandes y desplazarse hacia adelante una distancia mayor si sabe que n es grande (es decir, contar más de una nueva línea en un bloque de almacenamiento intermedio) –

8

Sí, use std::getline a menos que sepa la ubicación de las nuevas líneas.

Si por algún extraño motivo, usted sabe la ubicación donde aparecen las líneas nuevas, puede usar primero ifstream::seekg.

Puede leer de otras maneras, como ifstream::read, pero std::getline es probablemente la solución más fácil y clara.

+0

+1 - o al menos será +1 en 13 minutos cuando tenga votos ... –

+2

+1 - actual esta vez :) –

+0

@Billy: En realidad su tardanza me dio 10 representantes adicionales ya que yo ya estaba al límite máximo hasta hace 10 minutos. –

6

Por lo que vale la pena:

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

No, usted no tiene que utilizar getline cadenas

La manera más eficiente está ignorando con std :: :: istream ignorar

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 no es estándar, pero hecho a mano, por supuesto. El primer parámetro es la cantidad máxima de caracteres para extraer. Si esto es exactamente numeric_limits :: max(), no hay un límite: Enlace al cplusplus.com: std::istream::ignore

Si va a saltar una gran cantidad de líneas que definitivamente debe utilizar en lugar de getline: cuando necesitaba para omitir 100000 líneas en mi archivo, tardó aproximadamente un segundo en oposición a 22 segundos con getline.

Cuestiones relacionadas