以下は、iostream とそのバッファ オブジェクトのみを扱います。C スタイルの I/O に関連するバッファについては、@milleniumbug の回答を参照してください。
ほとんどの場合、(少なくとも通常は) 基になるバッファーをフラッシュしようとして失敗した場合に、ストリームの badbit セットが必要なためです。
また、ストリームが基礎となるストリームとやり取りするときに使用する少し複雑な小さなダンスもあります。ストリームはセントリー オブジェクトを作成し、アクションを実行してから、セントリー オブジェクトを破棄します。歩哨は、接頭辞と接尾辞の操作を例外的に安全にすることを目的としています。
したがって、全体的なシーケンスは次のようになります。
create sentry
if that succeeds (sentry converts to true) call rdbuf()->pubsync()
if that fails (returns -1) setstate(badbit);
ストリーム バッファ (たとえば、basic_filebuf
) は、基になるファイル システム オブジェクトに直接接続されます。実際、iostream オブジェクトと基になるファイル オブジェクト間のすべての対話は、ファイル バッファを介して行われます。上に示したように、ストリーム オブジェクトがバッファをフラッシュする必要がある場合、バッファのpubsync()
メンバ関数を呼び出してバッファ自体をフラッシュするように指示するだけです。
[参考:[ostream.unformatted]/7:
basic_ostream& フラッシュ();
効果: フォーマットされていない出力関数として動作します (27.7.3.6.1、パラグラフ 1 で説明されているように)。rdbuf() が null ポインターでない場合、sentry オブジェクトを構築します。このオブジェクトが bool 型の値に変換されたときに true を返す場合、関数は rdbuf()->pubsync() を呼び出します。その関数が -1 を返す場合、setstate(badbit) を呼び出します (ios_base::failure (27.5.5.4) をスローする可能性があります)。それ以外の場合、sentry オブジェクトが false を返すと、何もしません。
戻り値: *this.
...そして [ofstream.cons]/2:
明示的な basic_ofstream(const char* s, ios_base::openmode モード = ios_base::out);
効果: クラス basic_ofstream のオブジェクトを構築し、基本クラスを basic_ostream(&sb) で初期化し、sb を basic_filebuf() で初期化します (27.7.3.2、27.9.1.2)。次に、rdbuf()->open(s, mode|ios_base) を呼び出します。 ::アウト)。その関数がヌル ポインターを返す場合は、setstate(failbit) を呼び出します。