2012-08-28 6 views
9

In C++ hat jeder Strom eine bad Bit:Was könnte dazu führen, dass ein Stream in den "schlechten" Zustand übergeht?

Dieses Flag von Operationen auf den Strom eingestellt wird durchgeführt, wenn ein Fehler auftritt, während Lesen oder Schreiben von Daten, in der Regel den Verlust der Integrität des Stroms verursacht.

Source

Was würde dazu führen, einen Strom zu "Integrität verlieren" und geben Sie den bad Zustand? Dies entspricht nicht dem fail-Status, der am häufigsten auftritt, wenn ein Eingabestream versucht, einen Wert in einer Variablen zu speichern, die diesen Wert nicht akzeptieren kann (z. B. wenn versucht wird, eine Zeichenfolge in eine Ganzzahlvariable zu speichern).

Beachten Sie, dass diese Frage eine allgemeinere Form von c++ file bad bit ist, die für Dateieingangsströme spezifisch ist; Diese Frage ist kein exaktes Duplikat, da sie im Allgemeinen sowohl für Eingabe- als auch Ausgabeströme gilt.

+0

Vielleicht ein Multibyte-kodierter Stream, der auf eine ungültige Multibyte-Sequenz trifft? –

+0

@KerrekSB, das würde wahrscheinlich das 'fail'-Bit setzen, nicht das' bad'-Bit, da der Stream durch 'ios :: clear()' und 'ios :: ignore()' wiederhergestellt werden könnte. Dies ist einfach ein Fall von ungültiger Eingabe; Ich glaube nicht, dass der Stream die Integrität verliert. – bwDraco

Antwort

13

Nach cppreference.com:

Die Standardbibliothek setzt BadBit in den folgenden Situationen:

  • Insertion in den Ausgabestrom durch put() oder write() nicht aus irgendeinem Grund .

  • Insertion in den Ausgabestrom durch operator<<, std::put_money oder std::put_time, konnte nicht abgeschlossen werden, da das Ende des Ausgangs Strom erreicht wurde (die Formatierung Ausgabefunktion der Facette wie num_put::put() oder money_put::put(), gibt einen Iterator iter solche dass iter.failed()==true)

  • Stream ist für rdbuf() mit einem null-Zeiger konstruiert oder putback()/unget() heißt o na Strom mit einer Null-rdbuf() oder ein Nullzeiger übergeben operator<<(basic_streambuf*)

  • rdbuf()->sputbackc() oder rdbuf()->sungetc() return traits::eof() zu putback() or unget() `

  • rdbuf()->pubsync() -1 zurück zu sync(), zu flush(), oder nach destructor von ostream::sentry auf einem unitbuf stream

  • Ausnahme wird geworfen duri ng einer E/A-Operation durch irgendeine Mitgliedsfunktion von der zugehörige Strompuffer (z.B. sbumpc(), xsputn(), sgetc(), overflow(), etc)

  • Exception in iword() oder pword() ausgelöst wird (z.B.std::bad_alloc)


Dies kann ein Grund mehr sein cppreference.com wählen über www.cpluplus.com finden Sie unter: What's wrong with cplusplus.com?

+3

"Ausnahme bei einem zugrunde liegenden E/A-Vorgang" klingt wie ein guter Lead. Schließlich sollten Iostreams erweitert werden, und daher ist es durchaus vorstellbar, dass einige von Benutzern bereitgestellte Implementierungen Ausnahmen tiefer in den Hintergrund drängen. –

+1

Die "Absicht" ist, dass "badbit" einen tatsächlichen Eingabe-/Ausgabefehler signalisiert. Die Schnittstelle für 'std :: streambuf' lässt dies jedoch nicht zu; Es gibt entweder ein "char" oder "EOF" zurück. Wenn Sie beim Lesen von 'std :: filebuf 'einen Eingabefehler bekommen (' read' gibt '-1' unter Posix zurück), würde ich erwarten, dass' std :: filebuf' eine Ausnahme auslöst, weil es keine anderen Möglichkeiten gibt Signalisierung des Fehlers. –

1

Werfen Sie einen Blick die Apache C++ Standard Library User's Guide an. Zwei mögliche Ursachen für ein Badbit sind dort aufgeführt. Ich zitiere:

Speichermangel: Es ist kein Speicher verfügbar, um den Puffer zu erstellen, oder der Puffer hat Größe 0 aus anderen Gründen (z. B. von außerhalb des Streams bereitgestellt), oder der Stream kann Speicher für seinen nicht zuordnen eigene interne Daten.

Der zugrunde liegende Datenstrompuffer löst eine Ausnahme aus: Der Datenstrompuffer kann seine Integrität verlieren, z. B. bei Speichermangel, Codeumwandlungsfehler oder einem nicht behebbaren Lesefehler vom externen Gerät. Der Stream-Puffer kann diesen Integritätsverlust anzeigen, indem er eine Ausnahme auslöst, die vom Stream erfasst wird und dazu führt, dass der Badbit im Status des Streams gesetzt wird.

Verwandte Themen