Pregunta

Estoy inicialmente la construcción de un índice similar al mecanismo, leer cada línea del archivo de texto usando getline, comprobar si coincide con una declaración conocida cabecera (string.compare) y guardar la posición tellg como un índice para ese punto. Mi intención es que después utilice seekg (índice, ios :: beg) para buscar el lugar en el archivo en el que la cabecera es. Después de leer el archivo una vez que la construcción de mi índice y llamando seekg (0, ios :: beg) la siguiente getline devuelve una cadena vacía, donde espero ver la primera línea del archivo.

una parte de mi código es abajo para resaltar mejor mi problema

//build the index
while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead);
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

// start reading the file data
m_fileIn.seekg(0,ios::beg);
//read first line (title)

getLineID la función devuelve un int en función del resultado de la comparación de cadenas.

es el uso de getline incorrectos si tengo que volver a leer el archivo?

¿Fue útil?

Solución

Su problema está causado porque tiene un mal conjunto de bits dentro de la corriente.
Las operaciones en la corriente serán ignoradas hasta que el bit malo ha sido restablecido.

// After the loop reset the Bad Bits.
m_fileIn.clear()

Nota: A Bad bit es una de las muchas condiciones de error incluyendo EOF

Pero eso no es sus principales problemas:

Está utilizando el Classic anti pattern para la lectura de un archivo:
utilizar Más bien esto.

while (getline (m_fileIn,lineRead))
{
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

El problema es que el EOF no se establece hasta que haya leído allá de ella.
La última lectura válida lee UPTO pero no más allá de la EOF (EOF, por tanto, no está establecido).

Así que considere la situación en la que haya leído la última línea en el archivo. El EOF no se ha fijado como usted no ha leído pasado. Así se entra en el bucle. Ahora ejecuta getline (). Este intenta leer EOF pasado como no hay absolutamente ningún dato para leer (no un solo byte). Así getline () falla ahora que está llamando getlineID () usando lineRead cuyo valor es indeterminada (la norma no dice lo que ocurre con lineRead cuando se golpea la condición EOF, pero es probable que tenga el valor de la última línea lee como usted no parece para restablecerlo dentro del bucle).

Otro problema con este código es que sólo comprueba EOF. ¿Qué pasa cuando se produce otro tipo de error? El bucle en realidad se queda atascado en un bucle infinito; esto es porque cuando se establece un indicador de error no más lectura sucede por lo que nunca puede llegar a la EOF.

while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead)
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

La solución es llevar a cabo la operación de lectura en la prueba de bucle while. Esto funciona porque getline () devuelve el flujo pasado como primer parámetro. Por lo tanto, la corriente se utiliza en un contexto booleano. Cuando una corriente se utiliza en un contexto booleano se convierte en un tipo que puede ser utilizado como un valor booleano; el valor de este objeto es equivalente cierto si no hay errores y falso en caso contrario.

En esta situación, la lectura se intentó, pero si falla no se entra en el bucle.

Otros consejos

Después de publicar aquí y la pesca de arrastre de varios sitios web he añadido la línea

m_fileIn.clear();

antes de la línea

getline (m_fileIn,lineRead);

en la limpieza de los indicadores de error (estoy asumiendo eof error) que era capaz de continuar como normal.

Martin -. Estaría muy interesado en saber más sobre el anti-patrón que he utilizado sin saberlo, he actualizado mi código para incluir los cambios, muchas gracias

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top