ostream と ostringstream の違いは何ですか? いつどちらを使用しますか?
4 に答える
簡潔に言えば、 を提供し、ユーザーがostringstream
提供
する必要があります。streambuf
ostream
この意味を理解するには、ストリームがどのように機能するかを少し理解する必要がありますが、これについて 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
の便利なオーバーロードを提供するために独自の を定義するのは通常のことです (しかし、決して必須ではありません)
。ostream
istream
ofstream
ostringstream
ostream
同様に、インスタンスを作成するときは、直接使用して独自の streambuf を提供するのではなく、「便利な」派生クラスの 1 つを使用するのが通常です。
そして、これらすべてが複雑に思える場合: iostream クラスは C++ のほとんどすべての機能を使用します (仮想関数、テンプレート、および関数のオーバーロードはすべて重要な役割を果たします)。C++ を学んでいるだけなら、あまり心配する必要はありません。インスタンスを作成するときにofstream
or
を使用し、 への参照を渡します。また、仮想関数、テンプレート、演算子のオーバーロードなどの手法について学習したら、iostream に戻り、コードをより柔軟にするために iostream が果たす役割を理解してください。ostringstream
ostream
[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
ostream
rdbuf
背後に実装はありませんostringstream
が、stringbufを使用します。ドキュメントを試しましたか?