2010-11-17 21 views
21

Un colega me acaba de decir que este código:ifstream: comprobar si abierto con éxito

std::ifstream stream(filename.c_str()); 
if (!stream) 
{ 
    throw std::runtime_error(".."); 
} 

sería un error. Dijo que ifstream evalúa a 0 si la apertura es exitosa. Mi código funciona, pero quería encontrar la documentación pero no vi dónde dice cómo verificar si la apertura fue exitosa. ¿Me lo puedes señalar?

Respuesta

29

operator!is overloaded para std::ifstream, por lo que puede hacer esto.

En mi opinión, sin embargo, este es un abuso horrible de la sobrecarga del operador (por el comité de normas). Es mucho más explícito lo que está comprobando si solo hace if (stream.fail()).

+6

no se olvide de comprobar 'stream.bad()', 'stream.good()', 'stream.fail()', y 'stream.is_open()'. suspiro ... – Inverse

+0

muchas gracias por el enlace! Estoy de acuerdo en que no es bueno hacer el control con este operador, así que lo cambiaré. No hubiéramos tenido la discusión con if (stream.fail()). – Philipp

+9

¡El! está sobrecargado para verificar 'fallar' y 'malo' –

8

También puede usar is_open() para comprobar si funcionó, pero! está permitido (que no está comprobando si hay cero, que es un especial overload of !)

edición:
Solo por curiosidad - ¿por qué no presente una excepción?
Es solo que las transmisiones se introdujeron antes de las excepciones
o estamos en la antigua C++ de - es solo un error no lo suficientemente excepcional como para ser una excepción.

8

Puede hacer que una transmisión en particular arroje una excepción en cualquiera de eof/fail/bad llamando a su función ios::exceptions() con la máscara de bits adecuada. Por lo tanto, se podría reescribir el ejemplo de la pregunta inicial anterior como:

std::ifstream stream; 
stream.exceptions(std::ios::failbit | std::ios::badbit); 
stream.open(filename.c_str()); 

Aquí corriente arrojará una excepción cuando el failbit o badbit consigue el sistema. Por ejemplo, si ifstream::open() falla, establecerá el failbit y lanzará una excepción. Por supuesto, esto arrojará una excepción más adelante si cualquiera de estos bits se establece en la secuencia, por lo que esta reescritura no es exactamente la misma que en el ejemplo inicial. Puede llamar al

stream.exceptions(std::ios::goodbit); 

para cancelar todas las excepciones en la transmisión y volver a buscar errores.

2

Su colega es mal. Quizás haya olvidado que no está escribiendo C.

El código es perfecto. Es exactamente cómo debe verificar el estado del flujo.

Cuestiones relacionadas