c++ - problemas - istream:: getline return type
getline(cin variable) (5)
¿Qué devuelve el método istream::getline
?
Pregunto porque he visto que para recorrer un archivo, debería hacerse así:
while ( file.getline( char*, int ) )
{
// handle input
}
¿Qué se devuelve?
Devuelve la secuencia en sí. La secuencia puede convertir (a través de void*
) a bool
indicando su estado. En este ejemplo, su ciclo while finalizará cuando la conversión de la secuencia a bool
"falsa", lo que sucede cuando su flujo entra en un estado de error. En su código, es más probable que ocurra cuando hubo un intento de leer más allá del final del archivo. En resumen, leerá todo lo que hay, y luego se detendrá.
La función devuelve una referencia al objeto de secuencia en sí, que puede utilizarse para encadenar operaciones de lectura adicionales:
myStream.getline(...).getline(...);
o, debido a que los flujos son implícitamente convertibles a void *
s, en un bucle o condición:
while (myStream.getline(...)) {
...
}
Puede leer más sobre esto en el sitio web cplusplus.com:
Todos te han dicho lo que es, ahora déjame decirte, usa la versión gratuita
std::string line;
while(getline(file, line)) // assuming file is an instance of istream
{
//
}
¿Por qué esta versión? Debería ser inmediatamente evidente: pasas una std::string
lugar de un buffer de caracteres de tamaño fijo.
Devuelve una secuencia para que podamos encadenar la operación.
Pero cuando utiliza un objeto en un contexto booleano, el compilador busca un operador de conversión que pueda convertirlo en un tipo que pueda usarse en el contexto booleano.
En este caso, el flujo tiene el operator void*()
. Como esto da como resultado un puntero, puede usarse en un contexto booleano. Cuando se lo llama, comprueba los indicadores de error. Si se configuran failbit o badbit, entonces devuelve NULL, que es equivalente a FALSE; de lo contrario, devuelve un puntero a self (o algo válido pero no debe usar este hecho)).
De modo que puede usar una secuencia en cualquier contexto que requiera una prueba booleana:
if (stream >> x)
{
}
while(stream)
{
/* do Stuff */
}
Nota: No es buena idea probar el flujo en el exterior y luego leerlo / escribirlo dentro del cuerpo del enunciado condicional / de ciclo. Esto se debe a que el acto de leer puede hacer que la transmisión sea mala. Por lo general, es mejor leerlo como parte de la prueba.
while(std::getline(steam, line))
{
// The read worked and line is valid.
}
Mire de referencia . El istream devuelto por getline
se convierte en bool mediante conversión implícita para verificar el éxito de la operación. Esa conversión hace uso de if(mystream.getline(a,b))
en taquigrafía para if(!mystream.getline(a,b).fail())
.