1. ホーム
  2. c++

[解決済み] ostringstreamを再利用するには?

2022-08-15 02:03:50

質問

ostringstream (およびその下のバッファ) を消去して再利用し、アプリケーションがそれほど多くの割り当てを行う必要がないようにしたいと思います。 どのようにオブジェクトを初期状態に戻すのですか?

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

過去にclearとstrを連続して使ったことがあります。

// clear, because eof or other bits may be still set. 
s.clear();
s.str("");

これで入力と出力の両方の文字列ストリームに対して処理が行われました。あるいは、手動でクリアし、適切なシーケンスをbeginにシークすることもできます。

s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start

によって行われるいくつかの再割り当てを防ぐことができます。 str によって行われる再割り当てを防ぐことができます。結果はこのようになります。

std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");

文字列をc関数に使用したい場合は std::ends のように、終端をNULLにしてください。

std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b" << std::ends;
assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);

std::ends は、非推奨の std::strstream これは、スタック上に割り当てた文字配列に直接書き込むことができました。終端の NULL を手動で挿入する必要がありました。しかし std::ends が非推奨なのは、上記のようなケースでまだ使えるからだと思います。