24

教育目的で、ostream とストリーム バッファを作成して実行したいと考えています。

  1. << myVar; を実行するときのエンディアンを修正します。
  2. std:cout を使用したり、ファイルに書き込む代わりに、deque コンテナーに格納します。
  3. << を実行した回数、.write を実行した回数、書き込んだバイト数、flush() を実行した回数などの追加データをログに記録します。しかし、私はすべての情報を必要としません。

オーバーロードを試みましたが、ひどく失敗しました。私はやってみました

ostream& write( const char* s, streamsize n ) 

私のbasic_stringstream2クラス(私はbasic_stringstreamを私のcppファイルにコピーして貼り付けて変更しました)で、コードはbasic_ostreamを使用し続けました. コードを調べたところ、xsputn をオーバーロードする必要があるようです (このページhttp://www.cplusplus.com/reference/iostream/ostreamには記載されていません) が、他に何がオーバーロードする必要がありますか? クラスを構築するにはどうすればよいですか (継承する必要があるものなど)。

4

3 に答える 3

26

標準的なアプローチは、独自の streambuf を定義することにあります。以下をご覧ください。

于 2009-02-09T15:39:22.593 に答える
7

A+C の場合) ファセットを確認する必要があると思います。ファセットは、オブジェクトが文字としてどのように書き込まれるかを変更します。オブジェクトをストリーミングした回数に関する統計もここに保存できます。STL ストリームを使用するときに自分のオブジェクトをフォーマットする方法を確認してください。たとえば。

B) の場合、独自の streambuf を作成し、ostream をそのバッファー (コンストラクター引数) に接続する必要があります。Luc のリンク+ Deriving new streambuf classesを参照してください。要するに、これを ostream (最小) に実装する必要があります。

  • オーバーフロー (単一の文字またはフラッシュ バッファーを配置) (リンク)
  • xsputn (文字配列をバッファに入れる)(リンク)
  • 同期 (リンク)
于 2009-08-28T07:07:33.890 に答える
1

あなたがやりたいことが可能かどうかはわかりません。<<オペレーターは仮想ではありません。yourstream &operator << (yourstream &strm, int i)したがって、エンディアン変換とカウントで必要なことを行うように定義でき、コードが直接呼び出すときに機能します。しかし、ostream を期待する関数に yourstream オブジェクトを渡すと、その関数が を呼び出すたび<<に、あなたのものではなく元の ostream バージョンに移動します。

私が理解しているように、ストリーム機能は、異なる種類のバッファ (たとえば、文字の両端キューなど) を使用する新しいストリーム タイプを「簡単に」定義できるように設定されており、非常に簡単にサポートを追加できます。を介して独自のクラスを出力します<<。それらの間の中間層を再定義できるようにするつもりはないと思います。

特に、<<インターフェイスの全体的なポイントは、適切にフォーマットされたテキスト出力を提供することですが、実際にはバイナリ出力が必要なように思えます。(そうでなければ、「エンディアン」への言及は意味がありません。)これを行う何らかの方法があると仮定しても、私にはわかりませんが、せいぜいぎこちないバイナリ出力が生成されるだけです。たとえば、3D 空間でポイントを出力するエンド ユーザーのオーバーロードを考えてみましょう。のエンド ユーザー バージョンは、<<おそらく<< '(' << x << ", " << y << ", " << z << ')'. これはテキスト ストリームでは見栄えがしますが、理想的には<< x << y << z. (そして、それらは何回の呼び出し<<としてカウントされるべきですか?)

于 2009-02-09T14:55:57.283 に答える