2010-02-16 4 views
5

Quiero leer de una secuencia usando std::getline dentro de un ciclo for.lectura segura de una secuencia en un ciclo for usando getline

La corriente que quiero decir es una clase heredada de std::basic_iostream.

 
std::string line;    
for(;;){ 
     try{ 
      std::getline(myStreamObj, line); 
      if(line != ""){ 
       std::cout << line << std::endl; 
      } 
     } 
     catch(std::ios_base::failure& ex){ 
      std::cout << ex.what() << std::endl; 
     } 
    } 

Quiero también para comprobar frente a otras condiciones de error como

eofbit failbit badbit

pero estoy algo confundido al respecto.

Si se cumplen algunas de las condiciones de configuración de estas 3 banderas, ¿se lanza alguna excepción como std::ios_base::failure? ¿Cómo repartir estos 3 casos? ¿Debo hacer comprobaciones de otras maneras?

Gracias AFG

Respuesta

6

Los iostreams por defecto no generan excepciones cuando se producen errores. Si desea habilitarlos:

cout.execeptions(std::ios::badbit); 

habilitará excepciones si se establece badbit.

para permitirles todo:

cout.execeptions(std::ios::badbit 
        | std::ios::eofbit 
        | std::ios::failbit); 

Las excepciones lanzadas son de tipo:

std::ios_base::failure 

que se deriva de std::exception.

En general, sin embargo, es más fácil de no utilizar execptions, sino utilizar construcciones como:

while(std::getline(myStreamObj, line)) { 
    // process line 
} 
+0

Gracias por su respuesta! No sabía acerca de esta condición, por lo que resulta útil. ¿Puedo preguntarte un pequeño detalle más? ¿Por qué las excepciones no son una buena opción aquí? –

+0

@Abruzzo Muchas razones: más lento, no admite fácilmente la reanudación, necesita escribir más código para manejar los errores. Y la mayoría de las personas que leen su código esperarán que se usen excepciones * no * en esta área, por lo que encontrarán que el código es más difícil de entender. –

Cuestiones relacionadas