stringstreamのクリアの仕方

メモ。はてブでもよかったんだけど。
ググってみたらこんな記事をみつけた。

> # ちなみに、stringstream の文字列のクリアは
> # stringstremam::str("") で、一度はまりました(^^;

(中略)

stringstream::str("")は文字列ストリームのバッファを
クリアする方法ですが、意外と知らない人が多いようです。

うわぁ、はまったー
知りませんでしたw


(以下、6/27 追記)
ちなみに、stringstream::clear()はストリームの状態フラグをクリアするのに使うみたい。
こんな感じ↓

#include <iostream>
#include <sstream>
using namespace std;

int main(void)
{
    string str;
    stringstream ss;

    ss << "abc";
    ss >> str;
    cout << str << endl;

    ss.str(""); // バッファをクリアする。
    ss.clear(stringstream::goodbit); // ストリームの状態をクリアする。この行がないと意図通りに動作しない

    ss << "xyz";
    ss >> str;
    cout << str << endl;
    return 0;
}

実行結果はこうなる

abc
xyz

ss.clear(stringstream::goodbit);コメントアウトすると、

abc

となって、xyzが表示されない。
実はこれもはまった(笑)


元ネタ
http://www.velocityreviews.com/forums/t291775-stringstream-used-to-convert-int-to-string-does-work-only-once.html


元ネタの元ネタ(リンク切れ。2008年12月確認)
http://www.programmingforums.org/forum/showthread.php?t=4224


なんでも、上の例では最初の ss >> str; で "abc" を取り出した時にストリームが終端に達してしまい badbit がセットされてる為、以降のストリームに対する操作は失敗してしまうので ss.clear(stringstream::goodbit); で状態フラグをクリアしてやらないといけないらしいです。


#どうでもいいけど…
C++ stringstream クリア」でググると、このエントリーがトップで出てくるのな。びっくりだわ。
C++を省いても上から3つ目。
プログラミングについては、こっちがいろいろ教わりたいくらいなのになんか恐縮しちゃうわ