ifstream: compruebe si se abre correctamente

Un colega me acaba de decir que este código:

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

estaría mal. Dijo ifstream evalúa a 0 si la apertura es correcta. Mi código funciona, pero yo quería encontrar la documentación, pero que no ve donde dice cómo comprobar si la apertura fue un éxito. Puede que me apunte a ella?

InformationsquelleAutor Philipp | 2010-11-17

4 Kommentare

  1. 46

    operator! está sobrecargado para std::ifstream, por lo que puede hacer esto.

    En mi opinión, sin embargo, esto es un horrible abuso de la sobrecarga de operadores (por el comité de normas). Es mucho más explícito lo que está comprobando si usted acaba de hacer if (stream.fail()).

    • no se olvide de comprobar stream.bad(), stream.good(), stream.fail(), y stream.is_open(). suspiro…
    • muchas gracias por el enlace! Estoy de acuerdo en que no es agradable para hacer el check uso de este operador, así que voy a cambiarlo. No habríamos tenido la discusión con si (stream.fail()).
    • El ! está sobrecargado para comprobar ‘no’ y ‘malas’
    • Sí, fail() cheques de ambas banderas.
    • No hay un «abuso» aquí.
    • En realidad creo que no es más ambigua y/o que puedan confundir a los que los operadores, sólo porque se comprueba tanto failbit y badbit a pesar de su nombre.
    • ¿Por qué eso es un abuso? Es un operador válido, c++ soporta la sobrecarga, y leyendo el código de usarlo es agradable, ya que da a ‘si la corriente no está bien’.
    • porque es (en gran medida) un especial de copo de nieve – este (usando ! a decir de un «error») no es un patrón universal y para la OMI es disminuye legibilidad.
    • Probablemente en bikeshedding territorio en este punto, pero en mi opinión, operator! es bastante universal para decir «este objeto está en un estado no válido» para no trivial de clase o struct. Personalmente creo que un poco más claro que .fail(), que me golpea como un verbo a primera vista y me hace leer los documentos para estar seguro.

  2. 11

    Usted puede hacer una determinada secuencia de lanzar una excepción en cualquiera de las expresiones del folclore/falla/mal llamando a su ios::excepciones() función con la propia máscara de bits. Así, se puede 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, se produce una excepción cuando el failbit o badbit se establece. Por ejemplo, si ifstream::open() falla establecerá el failbit y lanzar una excepción. Por supuesto, esto generará una excepción más tarde si cualquiera de estos bits se establece en el arroyo, por lo que esta reescritura no es exactamente el mismo que el inicial ejemplo. Usted puede llamar a

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

    para cancelar todas las excepciones de la corriente y volver a la comprobación de errores.

  3. 10

    También puede utilizar is_open() para comprobar si funcionaba, pero ! está permitido (no es la comprobación de cero, es un especial la sobrecarga de ! )

    edición:

    Acaba de salir de interés – ¿por qué no esta de lanzar una excepción?

    Es justo que los arroyos se introdujeron antes de excepciones

    o estamos en la edad de C++ cosa – es sólo un error no excepcional suficiente para ser una excepción.

    • Me pregunto desde hace 20 años, lo que la necesidad de la existencia del fracaso de un objeto ifstream es… Potencialmente en otros 20 años este problema podría ser resuelto (por la introducción de otro constructor de tomar un adicional de please_throw() argumento?). Esperemos que esta vez, el motivo del error será incluida en el objeto de excepción.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea