13

C ++では、各ストリームにbadビットがあります。

このフラグは、データの読み取りまたは書き込み中にエラーが発生したときにストリームで実行される操作によって設定され、通常、ストリームの整合性が失われます。

ソース

ストリームが「整合性を失い」bad状態になる原因は何ですか?これは状態と同じではありません。これはfail、入力ストリームが値を受け入れられない変数に値を格納しようとした場合(文字列を整数変数に格納しようとした場合など)に最も頻繁に発生します。

この質問は、ファイル入力ストリームに固有のc++ファイルの不良ビットのより一般的な形式であることに注意してください。この質問は、一般に入力ストリームと出力ストリームの両方に当てはまるため、完全に重複しているわけではありません。

4

2 に答える 2

14

cppreference.comによると:

標準ライブラリは、次の状況で badbit を設定します。

  • put()またはによる出力ストリームへの挿入はwrite()、何らかの理由で失敗します。

  • または による出力ストリームへの挿入は、出力ストリームoperator<<の終わりに達したため完了できませんでした ( またはなどのファセットのフォーマット出力関数は、 のようなイテレータを返します) 。std::put_moneystd::put_timenum_put::put()money_put::put()iteriter.failed()==true

  • ストリームが のヌル ポインタを使用して構築されているrdbuf()か、 putback()/unget()がヌルを使用してストリーム上で呼び出されているrdbuf()か、または に渡されたヌル ポインタが使用されています。operator<<(basic_streambuf*)

  • rdbuf()->sputbackc()またはunget()`に rdbuf()->sungetc()戻りますtraits::eof()putback() or

  • rdbuf()->pubsync()-1をストリームのsync()flush()、またはデストラクタに返しますostream::sentryunitbuf

  • 関連付けられたストリーム バッファの任意のメンバー関数による I/O 操作中に例外がスローされます (例: sbumpc()xsputn()sgetc()など overflow())。

  • iword()またはpword()(例std::bad_alloc)で例外がスローされます。


これは、www.cpluplus.com よりも cppreference.com を選択するもう 1 つの理由かもしれません。参照: cplusplus.com の何が問題なのか?

于 2012-08-28T14:47:58.330 に答える
1

Apache C++ 標準ライブラリ ユーザーズ ガイドをご覧ください。そこには、不良ビットの潜在的な原因が 2 つあります。私は引用します:

メモリ不足: バッファを作成するために使用できるメモリがないか、他の理由 (ストリームの外部から提供されたなど) でバッファのサイズが 0 になっているか、ストリームが独自の内部データにメモリを割り当てることができません。

基になるストリーム バッファが例外をスローします。ストリーム バッファは、メモリ不足、コード変換の失敗、または外部デバイスからの回復不能な読み取りエラーのように、整合性を失う可能性があります。ストリーム バッファは、例外をスローすることによってこの整合性の喪失を示すことができます。例外はストリームによってキャッチされ、ストリームの状態に badbit が設定されます。

于 2012-08-28T14:51:43.083 に答える