web-dev-qa-db-ja.com

streambufと​​は正確には何ですか?どうやって使うの?

C++でI/Oストリームがどのように機能するかについてもう少し学ぼうとしていますが、いつ何を使用するのか本当に混乱しています。

streambufとは正確には何ですか?
いつstreambufstring、またはistreamと比較して、vectorを使用しますか? (最後の3つはすでに知っていますが、streambufがそれらとどのように比較されるかはわかりません。)

73
Mehrdad

ストリームバッファは入力または出力デバイスを表し、そのデバイスへのフォーマットされていないI/Oの低レベルインターフェイスを提供します。一方、ストリームは、フォーマットされていない基本的なI/O関数を介して、特にフォーマットされたI/O関数(つまり、operator<<およびoperator>>オーバーロード)を介して、バッファーの上位レベルのラッパーを提供します。ストリームオブジェクトは、ストリームバッファの有効期間も管理できます。

たとえば、ファイルストリームには内部ファイルストリームバッファがあります。ストリームはバッファの寿命を管理し、バッファはファイルへの実際の読み取りおよび書き込み機能を提供します。ストリームのフォーマット演算子は、最終的にストリームバッファーの未フォーマットのI/O関数にアクセスするため、ストリームのI/O関数を使用するだけでよく、バッファーのI/O関数に直接触れる必要はありません。

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

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

46
bames53

streambufの助けを借りて、偶数下位レベルで作業できます。基礎となるバッファへのアクセスを許可します。

ここにいくつかの良い例があります: C++ streambufsを使用してコピー、ロード、リダイレクト、ティー そして比較に関して、これは役に立つかもしれません、

enter image description here

詳細については、こちらを参照してください。 IOstream Library

60
COD3BOY