2011-11-14 10 views
55

I/OストリームがC++でどのように動作するかについてもう少し詳しく学習しようとしています。私は実際に何を使用するのか混乱しています。streambufと​​は何ですか?どうやって使うの?

正確にはstreambufとは何ですか?
istream、またはvectorと比較して、streambufはいつ使用しますか? (私はすでに最後の三つを知っているが、それがすべてでない場合streambufは、それらに比較していないか。)

+0

ストリームバッファの抽象度が低いです。 – Pubby

+1

@Pubby:Er、 "ストリームバッファ"とは何ですか?ストリームやバッファとはどう違うのですか? – Mehrdad

+0

私が理解しているところから、ストリームはin/outputをフォーマットし、そのバッファに格納します。 – Pubby

答えて

38

ストリームバッファは入力または出力デバイスを表し、そのデバイスへのフォーマットされていないI/Oのための低レベルのインタフェースを提供します。一方、ストリームは、基本的なフォーマットされていないI/O機能、特にフォーマットされたI/O機能(すなわち、operator<<およびoperator>>過負荷)を介して、バッファの周りにより高いレベルのラッパーを提供する。ストリームオブジェクトは、ストリームバッファの存続期間を管理することもできる。

たとえば、ファイルストリームには内部ファイルストリームバッファがあります。ストリームはバッファの存続期間を管理し、バッファは実際の読み書き機能をファイルに提供します。ストリームの書式設定演算子は最終的にストリームバッファの書式なしの入出力関数にアクセスするため、ストリームの入出力関数を使用するだけで済み、バッファの入出力関数に直接触れる必要はありません。

違いを理解するもう1つの方法は、ロケールオブジェクトのさまざまな用途を調べることです。ストリームは、numpunctnum_getのようなフォーマットに関連したファセットを使用します。また、カスタム時間または金額データタイプのストリームoperator<<operator>>のオーバーロードは、時間と金額の書式設定ファセットを使用することも期待できます。ただし、ストリームバッファは、コーデックファセットファセットを使用して、ユニット間でインターフェイスの使用とバイトを変換します。たとえば、basic_streambuf<char16_t>のインターフェイスはchar16_tを使用しており、basic_streambuf<char16_t>は内部でcodecvt<char16_t, char, mbstate_t>を内部的に使用して、フォーマットされたのユニットをバッファに書き込んで、元のデバイスに書き込まれた単位をに変換します。したがって、ストリームは主にフォーマット用であり、ストリームバッファは、フォーマットされていない入力または出力に低レベルのインタフェースを提供し、異なる外部エンコーディングを使用する可能性があります。

I/Oデバイスへの書式なしのアクセスのみを必要とする場合は、ストリームバッファを使用できます。ストリームバッファを共有する複数のストリームを設定する場合は、ストリームバッファを使用することもできます(ただし、バッファの寿命を慎重に管理する必要があります)。 C++ 11のwbuffer_convertのような特殊用途のストリームバッファもあり、basic_streambuf<char>のファサードとして機能し、ワイド文字ストリームバッファのように見えます。任意のロケールに接続されたcodecvtファセットを使用する代わりに、作成されたコーデックファセットを使用します。通常は、適切なファセットを持つロケールが埋め込まれたワイドストリームバッファを使用するだけで、同じ効果を得ることができます。

+3

これは5年遅れですので、私は答えとして投稿し、これを受け入れませんが、これを読んだ後でもまだ用語で混乱している人にとっては、 'streambuf'は** raw **ですデータ(生のバイト、生のintなど)ですが、 'stream'は**調理された**データ(テキスト、テキストとしてフォーマットされた整数など)です。別の言い方をすれば、 'stream'は**解析**(または直列化)層を表します。プレーンな文字列を扱う場合、どちらかを技術的に使うことができますが、意味は異なります。 'streambuf'は生データを文字列そのものにすることを意味しますが、' stream'はエンコーディングを抽象化します。 – Mehrdad

46

streambufの助けを借りて、私たちも、低いレベルで作業することができます。基になるバッファへのアクセスを可能にします。ここで

は、いくつかの良い例です:Copy, load, redirect and tee using C++ streambufsとの比較を参照して、これは役に立つかもしれません、

enter image description here

は、詳細についてはこれを参照してください:IOstream Library

+3

+1素晴らしい記事を指しています。 – jweyrich

+1

私はstreambufと​​この記事を説明できる何かを探しました。私がそれを見つけるのを助けてくれてありがとう – wvdschel

関連する問題