2012-08-28 10 views
9

En C++, cada flujo tiene un poco bad:¿Qué podría hacer que una corriente entrara en el estado "malo"?

Este indicador se establece por las operaciones realizadas en la corriente cuando se produce un error mientras leer o escribir datos, generalmente haciendo que la pérdida de la integridad de la corriente.

Source

¿Qué causaría una corriente de "perder la integridad" y entrar en el estado bad? Esto no es lo mismo que el estado fail, que ocurre con mayor frecuencia cuando una corriente de entrada intenta almacenar un valor en una variable que no puede aceptar dicho valor (como intentar almacenar una cadena en una variable entera).

Tenga en cuenta que esta pregunta es una forma más general de c++ file bad bit, que es específica de las transmisiones de entrada de archivos; esta pregunta no es un duplicado exacto, ya que se aplica a los flujos de entrada y salida en general.

+0

¿Quizás una secuencia codificada en varios bytes que encuentra una secuencia multibyte no válida? –

+0

@KerrekSB, que probablemente establecería el bit 'fail', no el bit' bad', ya que la secuencia podría recuperarse mediante 'ios :: clear()' y 'ios :: ignore()'. Esto es simplemente un caso de entrada inválida; No creo que eso cause que la transmisión pierda integridad. – bwDraco

Respuesta

13

Según cppreference.com:

Los conjuntos de la biblioteca estándar badbit en las siguientes situaciones:

  • La inserción en el flujo de salida por put() o write() falla por cualquier razón .

  • inserción en el flujo de salida por operator<<, std::put_money o std::put_time, podría no completa porque se ha alcanzado el final de la secuencia de salida (función de salida el formato de la faceta como num_put::put() o money_put::put(), devuelve un iterador iter tales que iter.failed()==true)

  • corriente se construye con un puntero nulo para rdbuf(), o putback()/unget() se llama o corriente na con un nulo rdbuf(), o un puntero nulo pasado a operator<<(basic_streambuf*)

  • rdbuf()->sputbackc() o rdbuf()->sungetc() retorno traits::eof() a putback() or unget() `

  • rdbuf()->pubsync() devuelve -1 a sync(), a flush(), o para la destructor de ostream::sentry en una secuencia unitbuf

  • Exception is thrown duri ng una operación de E/S mediante cualquier función de miembro de el búfer de secuencia asociado (p. sbumpc(), xsputn(), sgetc(), overflow(), etc)

  • excepción en iword() o pword() (por ejemplostd::bad_alloc)


Esta puede ser una razón más para elegir cppreference.com sobre www.cpluplus.com, ver: What's wrong with cplusplus.com?

+3

"Excepción en una operación de E/S subyacente" suena como una buena pista. Después de todo, iostreams estaban destinados a ser extendidos, por lo que es perfectamente concebible que alguna implementación suministrada por el usuario arroje excepciones más profundas. –

+1

El "intento" es para 'badbit' para señalar un error real de entrada/salida. La interfaz para 'std :: streambuf' no permite esto, sin embargo; devuelve un 'char' o' EOF'. Si obtiene un error de entrada al leer un 'std :: filebuf' (' read' devuelve '-1' en Posix), esperaría que' std :: filebuf' arrojara una excepción, porque no tiene otro medio de señalando el error –

1

Tome un vistazo a la Apache C++ Standard Library User's Guide. Aquí se enumeran dos posibles causas de un badbit. Cito:

Carencia de memoria: No hay memoria disponible para crear el búfer, o el búfer tiene el tamaño 0 por otros motivos (como ser proporcionado desde fuera de la secuencia) o la secuencia no puede asignar memoria para su poseer datos internos.

El almacenamiento intermedio de flujo subyacente arroja una excepción: El almacenamiento intermedio de flujo puede perder su integridad, como falta de memoria o error de conversión de código, o un error de lectura irrecuperable del dispositivo externo. El almacenamiento intermedio de flujo puede indicar esta pérdida de integridad lanzando una excepción, que es captada por el flujo y da como resultado el establecimiento del badbit en el estado del flujo.

Cuestiones relacionadas