18

ostream と ostringstream の違いは何ですか? いつどちらを使用しますか?

4

4 に答える 4

35

簡潔に言えば、 を提供し、ユーザーがostringstream提供 する必要があります。streambufostream

この意味を理解するには、ストリームがどのように機能するかを少し理解する必要がありますが、これについて Web に適切な説明があるかどうかはわかりません。の基本的な抽象化は、ostreamテキスト出力の書式設定です。intまたは (またはユーザーdouble定義型 — 詳細は後述) を指定すると、それが 型の文字ストリームに変換されますchar。そのストリームで何をするかは、streambufそれに接続されている によって異なります。これは戦略パターンの例です。ここで、 は戦略streambufの抽象基本クラスです[1]。標準ではstreambuffilebufとの 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 を返し、挿入は常に失敗します。

于 2012-08-21T14:16:47.633 に答える
14

これは、C++ ストリーム クラスの継承階層の優れたビューです:) このセクションのこの記事には、 3.1 ofstream and ostringstream必要なものが含まれています。

本質的に:ofstreamクラスはそれを可能にwrite data to files using stream operationsし、ostringstreamクラスはそれを可能にしwrite to stringsます。

ここに画像の説明を入力

于 2012-08-21T12:19:26.567 に答える
6

ostreamより一般的(サブクラスはさまざまな場所への書き込みをサポートします)、ostringstream特定の1つはへの書き込みをサポートしますstring

于 2012-08-21T12:05:36.693 に答える
3

ostreamrdbuf背後に実装はありませんostringstreamが、stringbufを使用します。ドキュメントを試しましたか?

于 2012-08-21T12:05:41.997 に答える