Pregunta

¿Qué significa el retorno del método istream::getline?

Me pregunto porque he visto que colocar a través de un archivo, se debe hacer la siguiente manera:

while ( file.getline( char*, int ) )
{
    // handle input
}

Lo que está siendo devuelto?

¿Fue útil?

Solución

Devuelve una corriente de modo que podamos encadenar la operación.

Sin embargo, cuando se utiliza un objeto en un contexto booleano las miradas del compilador para un operador de conversión que puede convertir en un tipo que puede ser utilizado en el contexto booleano.

C ++ 11

En este caso, la corriente tiene explicit operator bool() const . Cuando se llama comprueba los indicadores de error. Si bien failbit o badbit se establecen a continuación, devuelve falso en caso contrario devuelve cierto.

C ++ 03

En este caso, la corriente tiene operator void*() const . Como esto resulta en un puntero que puede ser utilizado en un contexto booleano. Cuando se llama comprueba los indicadores de error. Si bien failbit o badbit se establecen a continuación, devuelve NULL, lo que equivale a FALSE de lo contrario, devuelve un puntero a la libre (o algo más válida aunque no se debe utilizar este hecho)).

Uso

Así que usted puede utilizar una corriente en cualquier contexto que requeriría una prueba booleana:

if (stream >> x)
{    
}

while(stream)
{
    /* do Stuff */
}

Nota: Es mala idea probar la corriente en el exterior y luego leer / escribir en él dentro del cuerpo de la declaración / bucle condicional. Esto se debe a que el acto de leer puede hacer el mal flujo. Por lo general es mejor hacer la lectura como parte de la prueba.

while(std::getline(steam, line))
{
    // The read worked and line is valid.
}

Otros consejos

referencia . El istream regresar de getline se convierte a bool por implícita conversión para comprobar el éxito de operación. Que la conversión hace uso de if(mystream.getline(a,b)) en forma abreviada de if(!mystream.getline(a,b).fail()).

La función devuelve una referencia al propio objeto corriente, que se puede utilizar ya sea a la cadena de operaciones de lectura, además:

myStream.getline(...).getline(...);

o, debido a las corrientes son convertir implícitamente a void *s, en un bucle o condición:

while (myStream.getline(...)) {
    ...
}

Se puede leer más sobre esto en el sitio web cplusplus.com:

http://cplusplus.com/reference/iostream/istream/getline/

Devuelve la corriente misma. La corriente puede convertir (a través de void*) para bool que indica su estado. En este ejemplo, el bucle while terminará cuando la conversión de la corriente que pasa bool "falsa", que ocurre cuando el flujo entra en un estado de error. En su código, es más probable que ocurra cuando se produjo un intento de leer más allá del final del archivo. En resumen, que va a leer tanto como hay, y luego se detiene.

Todo el mundo le ha dicho lo que es, ahora deja que te diga, utilice el forma libre versión

std::string line; 
while(getline(file, line)) // assuming file is an instance of istream
{
//
}

¿Por qué esta versión? Debería convertirse inmediatamente evidente - se pasa en un std::string en lugar de algún búfer de caracteres de tamaño fijo

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