C++でI/Oストリームがどのように機能するかについてもう少し学ぼうとしていますが、いつ何を使用するのか本当に混乱しています。
streambuf
とは正確には何ですか?
いつstreambuf
、string
、またはistream
と比較して、vector
を使用しますか? (最後の3つはすでに知っていますが、streambuf
がそれらとどのように比較されるかはわかりません。)
ストリームバッファは入力または出力デバイスを表し、そのデバイスへのフォーマットされていないI/Oの低レベルインターフェイスを提供します。一方、ストリームは、フォーマットされていない基本的なI/O関数を介して、特にフォーマットされたI/O関数(つまり、operator<<
およびoperator>>
オーバーロード)を介して、バッファーの上位レベルのラッパーを提供します。ストリームオブジェクトは、ストリームバッファの有効期間も管理できます。
たとえば、ファイルストリームには内部ファイルストリームバッファがあります。ストリームはバッファの寿命を管理し、バッファはファイルへの実際の読み取りおよび書き込み機能を提供します。ストリームのフォーマット演算子は、最終的にストリームバッファーの未フォーマットのI/O関数にアクセスするため、ストリームのI/O関数を使用するだけでよく、バッファーのI/O関数に直接触れる必要はありません。
違いを理解する別の方法は、ロケールオブジェクトのさまざまな使用法を調べることです。ストリームは、numpunct
やnum_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ファセットを使用します。通常、適切なファセットを持つロケールが埋め込まれたワイドストリームバッファを使用するだけで、同じ効果を実現できます。
streambuf
の助けを借りて、偶数下位レベルで作業できます。基礎となるバッファへのアクセスを許可します。
ここにいくつかの良い例があります: C++ streambufsを使用してコピー、ロード、リダイレクト、ティー そして比較に関して、これは役に立つかもしれません、
詳細については、こちらを参照してください。 IOstream Library