2011-01-16 23 views
13

¿Qué devuelve el método istream::getline?istream :: getline return type

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?

+0

istream & es el tipo de devolución. – DumbCoder

+0

Sí, debería haber dicho que ya lo sé. pero obviamente algo es extraño al respecto, porque de él se deriva alguna forma de verdadero o falso. –

+0

Sobrecarga los operadores 'bool' o' void * 'para que cuando se muestre implícitamente en la condición if(), pueda devolver si se ha alcanzado el EOF o no – Cameron

Respuesta

15

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 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)).

esta manera 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 el interior del cuerpo de la declaración condicional/loop. 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. 
} 
5

Mirar desde reference. La istream devuelta desde getline se convierte en bool por implicit conversion para verificar el éxito de la operación. Esa conversión hace uso de if(mystream.getline(a,b)) en forma abreviada de if(!mystream.getline(a,b).fail()).

+0

Su enlace no contiene nada que encaje con su extracto. – iheanyi

+0

@iheanyi Se agregó una aclaración, tal vez las páginas han cambiado con el tiempo. –

+0

Gracias, he votado su respuesta con ese cambio. – iheanyi

2

la función devuelve una referencia al propio objeto corriente, que se puede utilizar ya sea a la cadena de leer aún más las operaciones:

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

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

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

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

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

2

Devuelve la transmisión en sí. La secuencia puede convertir (a través de void*) a bool indicando su estado. En este ejemplo, su bucle while terminará cuando la conversión de la corriente a bool pase a ser "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á.

+0

+1. Puede convertirse en bool porque sobrecarga el 'operador bool()' (o 'operator void *()', no estoy seguro de cuál) – Cameron

+0

@Cameron: Es 'operator void *()'. –

0

Todo el mundo le ha dicho lo que es, ahora deja que te diga, utilice la versión free form

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

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

+0

, pero ¿y si quieres un 'char *' en lugar de 'std :: string'? esa es la situación en la que estoy. –

+0

'std :: string' tiene el método' c_str() 'que le devolverá lo que necesita, si necesita modificar la cadena, entonces hay métodos de' std :: string' puedes usar para modificarlo. – Nim