1. ホーム
  2. c++

[解決済み] streambufとは何ですか?どう使えばいいのですか?

2023-04-05 04:55:04

質問

C++でI/Oストリームがどのように動作するかについてもう少し学びたいのですが、いつ何を使えばいいのか本当に混乱しています。

正確には streambuf ?

を使用するのはいつですか? streambuf と比較して string に比べて istream または vector ? (最後の3つは既に知っていますが、どのように streambuf がそれらに比べてどうなのか、もしそうであれば、ですが)

どのように解決するのですか?

ストリームバッファは入力または出力デバイスを表し、そのデバイスへの書式なし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デバイスにフォーマットされていないアクセスのみが必要な場合、ストリームバッファを使用することができます。また、ストリームバッファを共有する複数のストリームをセットアップしたい場合にも、ストリームバッファを使用できます (ただし、バッファの寿命を注意深く管理する必要があります)。また、以下のような特殊用途のストリームバッファもあります。 wbuffer_convert のファサードとして機能する C++11 の のような特別な目的のストリームバッファもあります。 basic_streambuf<char> のファサードとして機能し、広い文字ストリームバッファのように見せます。これは、任意のロケールに接続された codecvt ファセットを使用する代わりに、それが構築された codecvt ファセットを使用します。通常、適切なファセットを持つロケールが組み込まれたワイドストリームバッファを使用するだけで、同じ効果を得ることができます。