I/OストリームがC++でどのように動作するかについてもう少し詳しく学習しようとしています。私は実際に何を使用するのか混乱しています。streambufとは何ですか?どうやって使うの?
正確にはstreambuf
とは何ですか?
、istream
、またはvector
と比較して、streambuf
はいつ使用しますか? (私はすでに最後の三つを知っているが、それがすべてでない場合streambuf
は、それらに比較していないか。)
I/OストリームがC++でどのように動作するかについてもう少し詳しく学習しようとしています。私は実際に何を使用するのか混乱しています。streambufとは何ですか?どうやって使うの?
正確にはstreambuf
とは何ですか?
、istream
、またはvector
と比較して、streambuf
はいつ使用しますか? (私はすでに最後の三つを知っているが、それがすべてでない場合streambuf
は、それらに比較していないか。)
ストリームバッファは入力または出力デバイスを表し、そのデバイスへのフォーマットされていないI/Oのための低レベルのインタフェースを提供します。一方、ストリームは、基本的なフォーマットされていないI/O機能、特にフォーマットされたI/O機能(すなわち、operator<<
およびoperator>>
過負荷)を介して、バッファの周りにより高いレベルのラッパーを提供する。ストリームオブジェクトは、ストリームバッファの存続期間を管理することもできる。
たとえば、ファイルストリームには内部ファイルストリームバッファがあります。ストリームはバッファの存続期間を管理し、バッファは実際の読み書き機能をファイルに提供します。ストリームの書式設定演算子は最終的にストリームバッファの書式なしの入出力関数にアクセスするため、ストリームの入出力関数を使用するだけで済み、バッファの入出力関数に直接触れる必要はありません。
違いを理解するもう1つの方法は、ロケールオブジェクトのさまざまな用途を調べることです。ストリームは、numpunct
とnum_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ファセットを使用する代わりに、作成されたコーデックファセットを使用します。通常は、適切なファセットを持つロケールが埋め込まれたワイドストリームバッファを使用するだけで、同じ効果を得ることができます。
これは5年遅れですので、私は答えとして投稿し、これを受け入れませんが、これを読んだ後でもまだ用語で混乱している人にとっては、 'streambuf'は** raw **ですデータ(生のバイト、生のintなど)ですが、 'stream'は**調理された**データ(テキスト、テキストとしてフォーマットされた整数など)です。別の言い方をすれば、 'stream'は**解析**(または直列化)層を表します。プレーンな文字列を扱う場合、どちらかを技術的に使うことができますが、意味は異なります。 'streambuf'は生データを文字列そのものにすることを意味しますが、' stream'はエンコーディングを抽象化します。 – Mehrdad
streambuf
の助けを借りて、私たちも、低いレベルで作業することができます。基になるバッファへのアクセスを可能にします。ここで
は、いくつかの良い例です:Copy, load, redirect and tee using C++ streambufsとの比較を参照して、これは役に立つかもしれません、
は、詳細についてはこれを参照してください:IOstream Library
ストリームバッファの抽象度が低いです。 – Pubby
@Pubby:Er、 "ストリームバッファ"とは何ですか?ストリームやバッファとはどう違うのですか? – Mehrdad
私が理解しているところから、ストリームはin/outputをフォーマットし、そのバッファに格納します。 – Pubby