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が表示されない。
実はこれもはまった(笑)
元ネタの元ネタ(リンク切れ。2008年12月確認)
http://www.programmingforums.org/forum/showthread.php?t=4224
なんでも、上の例では最初の ss >> str;
で "abc" を取り出した時にストリームが終端に達してしまい badbit がセットされてる為、以降のストリームに対する操作は失敗してしまうので ss.clear(stringstream::goodbit);
で状態フラグをクリアしてやらないといけないらしいです。
#どうでもいいけど…
「C++ stringstream クリア」でググると、このエントリーがトップで出てくるのな。びっくりだわ。
C++を省いても上から3つ目。
プログラミングについては、こっちがいろいろ教わりたいくらいなのになんか恐縮しちゃうわ