« 寝坊 | メイン | 書籍購入 »

2003年09月30日

stringstream

stringstreamの扱いではまってしまった。

std::stringstream stream;
stream << "foo";
std::cout << stream.str() << std::endl;
stream << "bar";
std::cout << stream.str() << std::endl;

といった感じでstringstreamをsprintfの代わりに使い回そうって考えた。上のコードだと当然ながら2回目の出力時に"foobar"と出てしまうので、出力前にstringstreamをクリアする必要が出てくる。ところが、リファレンスを見てもそれっぽいメンバが見あたらない。clear()は意味が違うし、seekp(0)でポインタ移動させてもデータが消える訳じゃない(当たり前)。

stringstreamでぐぐって調べたみたところ、Experts Exchangeで俺と同じ質問している人を発見。どうやら、str(std::string(""))でいいらしい。うまくいくんだけど、ちょっぴり不満。std::stringみたいにerase()とかあってもいいのに。

投稿者 sai : 2003年09月30日 20:02

コメント

はじめまして。ずばりこれを探してました。
ありがとうございます。
お礼まで。

>erase()とかあってもいいのに
まったく同感です。

投稿者 popo : 2005年09月27日 10:52

popoさん、初めまして。お役に立てて何よりです。
stringstreamの使い回しをしようとすると、ここではまってしまう人が多いみたいですね。

clear()といういかにもそれっぽいメンバ関数があるのも混乱の元じゃないかと思います。
vectorやlistなどコンテナの要素の削除はそれでできるのに、stringstreamではできない。。。
stream系のclearはそういうもの(フラグのクリア)だと言われればそうなんですが。

投稿者 sai : 2005年09月27日 19:36

コメントしてください




保存しますか?