2008-11-03 9 views
25

Tengo un ciclo que lee cada línea en un archivo usando getline().std :: getline() devuelve

istream is; 
string line; 
while (!getline(is, line).eof()) 
{ 
} 

Noté que getline llamando al() como esto también parece funcionar:

while (getline(is, line)) 

lo que está pasando aquí? getline() devuelve una referencia de flujo. ¿Se está convirtiendo en un puntero de alguna manera? ¿Es esto realmente una buena práctica o debería apegarme a la primera forma?

Respuesta

26

La istream devuelta por getline() tiene su operador void *() llamado implícitamente método, que devuelve si la secuencia se ha encontrado con un error. Como tal, está haciendo más comprobaciones que una llamada a eof().

+0

Charles tiene razón, también está confundiendo con el operador proporcionado por el centinela. –

+0

Eliminé mi última publicación mientras escribía una prueba. Ahora estoy bastante seguro de que se convierte en bool. –

+0

A menos que su implementación de SL no sea estándar, se anula *. Eso es lo que requiere el estándar. –

8

Actualizado:

había señalado erróneamente a la basic_istream documentation para el método bool operador() en la clase basic_istream :: centinela, pero como se ha señalado que esto no es en realidad lo que está sucediendo. He votado las respuestas correctas de Charles y Luc. En realidad es el operador void *() el que recibe la llamada. Más sobre esto in the C++ FAQ.

+0

Usted está confundiendo el centinela con basic_ios :: operator void *() -> http://dinkumware.com/ manuals/default.aspx? manual = compleat & page = ios.html # basic_ios :: operator% 20void% 20 * –

+0

Buen punto. También estoy corregido. – tgamblin

+1

su enlace está muerto – qdii

-3

Me quedaría con el primer formulario. Si bien la segunda forma puede funcionar, no es muy explícita. Su código original describe claramente qué se está haciendo y cómo se espera que se comporte.

+0

La transmisión podría ser mala y no eof(), sin embargo. Si quieres ser explícito, puedes llamar a good(). – tgamblin

+0

Sí, tienes razón. Sería mejor utilizar el primer formulario, pero con una llamada a .good() en lugar de .eof() –

+2

Personalmente, me gusta el uso de conversión implícita a bool. Parece que todos los otros idiomas que se repiten en las líneas. –

5

Charles dio el correct answer.

Lo que se llama es de hecho std::basic_ios::operator void*(), y no sentry::operator bool(), lo cual es consistente con el hecho de que std::getline() devuelve un std::basic_istream (por lo tanto, un std::basic_ios), y no un centinela.

Para los no creyentes, véase:

De lo contrario, como ya se ha dicho, prefiera la segunda forma que h es canónico. Use no fail() si realmente quiere un código detallado - Nunca recuerdo si se puede usar xxx.good() en lugar de !xxx.fail()

+0

De hecho. dinkumware ha eliminado su documentación en línea. Enlace fijo Gracias. –

Cuestiones relacionadas