ostream と ostringstream の違いは何ですか? いつどちらを使用しますか?
4 に答える
簡潔に言えば、 を提供し、ユーザーがostringstream提供
する必要があります。streambufostream
この意味を理解するには、ストリームがどのように機能するかを少し理解する必要がありますが、これについて Web に適切な説明があるかどうかはわかりません。の基本的な抽象化は、ostreamテキスト出力の書式設定です。intまたは
(またはユーザーdouble定義型 — 詳細は後述) を指定すると、それが 型の文字ストリームに変換されますchar。そのストリームで何をするかは、streambufそれに接続されている によって異なります。これは戦略パターンの例です。ここで、 は戦略streambufの抽象基本クラスです[1]。標準ではstreambuf、filebufとの 2 つの実装が提供されていstringbufます。実際には、最も些細なアプリケーションを除いて、自分で実装するものもあるでしょう。
出力するときは、常にostream;を使用します。<<演算子が定義されているクラス
です。データを文字のストリームにフォーマットしていますが、ストリームがどこで終了するかはあまり気にしません。
インスタンスを作成する場合: を作成する場合ostreamは、それを自分自身で提供する必要がありstreambufます。多くの場合、
ofstreamまたはを作成しますostringstream。これらはどちらも から派生した「便利な」クラスでありostream、 を提供しstreambufます (filebuf
およびstringbuf、場合によっては )。実際には、必要なものを提供するだけです(streambufこれはコンストラクタとデストラクタに影響し、他にはあまり影響しません)。の場合ofstream、インターフェイスの追加機能に転送する追加機能がいくつかありfilebufます。
or
と同じ行に沿って、(および
、関連する場合は)streambufの便利なオーバーロードを提供するために独自の を定義するのは通常のことです (しかし、決して必須ではありません)
。ostreamistreamofstreamostringstream
ostream同様に、インスタンスを作成するときは、直接使用して独自の streambuf を提供するのではなく、「便利な」派生クラスの 1 つを使用するのが通常です。
そして、これらすべてが複雑に思える場合: iostream クラスは C++ のほとんどすべての機能を使用します (仮想関数、テンプレート、および関数のオーバーロードはすべて重要な役割を果たします)。C++ を学んでいるだけなら、あまり心配する必要はありません。インスタンスを作成するときにofstreamor
を使用し、 への参照を渡します。また、仮想関数、テンプレート、演算子のオーバーロードなどの手法について学習したら、iostream に戻り、コードをより柔軟にするために iostream が果たす役割を理解してください。ostringstreamostream
[1] さまざまな理由から、std::streambuf実際には抽象的ではありません。しかし、その中の仮想関数の実装は役に立ちません。抽出は常に EOF を返し、挿入は常に失敗します。
これは、C++ ストリーム クラスの継承階層の優れたビューです:)
このセクションのこの記事には、
3.1 ofstream and ostringstream必要なものが含まれています。
本質的に:ofstreamクラスはそれを可能にwrite data to files using stream operationsし、ostringstreamクラスはそれを可能にしwrite to stringsます。

ostreamより一般的(サブクラスはさまざまな場所への書き込みをサポートします)、ostringstream特定の1つはへの書き込みをサポートしますstring
ostreamrdbuf背後に実装はありませんostringstreamが、stringbufを使用します。ドキュメントを試しましたか?