stringstream変数をどのようにクリアしますか?


486

私はすでにいくつかのことを試しました、

std::stringstream m;
m.empty();
m.clear();

どちらも機能しません。

回答:


771

すべての標準ライブラリタイプで、メンバー関数empty()はコマンドではなくクエリです。つまり、「空ですか?」「内容を捨ててください」ではありません。

clear()メンバ関数から継承されるiosと、ファイルストリームはにエラー状態が設定されている場合例えば、ストリームのエラー状態をクリアするために使用されているeofbit(ファイルの終端)、その後、呼び出し元clear()にエラー状態をバックに設定されますgoodbit(エラーなし) 。

の内容をクリアするにはstringstream、次を使用します:

m.str("");

正しいですが、以下を使用しています:

m.str(std::string());

std::stringを取るコンストラクタを呼び出さないため、技術的にはより効率的ですconst char*。しかし、最近のコンパイラーはどちらの場合でも同じコードを生成できるはずです。そのため、私はより読みやすいものを使用します。


105
「clear()」の部分を忘れた場合は、次のようになります。stackoverflow.com/q/2848087/635549
galath

8
@KshitijBanerjee C ++ではm.str()とm.str( "")は2つの異なる関数だと思います。m.str()はパラメーターを必要としない関数を呼び出しますが、m.str( "")はconst char *パラメーターを受け入れる関数を呼び出します。m.str()は文字列を返すget関数として実装されている可能性がありますが、m.str( "")はset関数として実装されている可能性があります。
Dinesh PR

4
galathが言ったように、m.clear();を追加することも非常に重要です。m.str( "");に加えて。そうしないと、ある時点で文字列ストリームに空の文字列を入力すると、問題が発生する可能性があります。
Sputnik、

1
@anthropodはい、昨年でした。それ以来、私はそれを機能させています。
James

1
ああ少年はこの直感的です。C ++の他のすべてと同じように!
晴れた月

47

エラー状態をクリアし、文字列ストリームをすべて1行で空にすることができます

std::stringstream().swap(m); // swap m with a default constructed stringstream

これにより、mがデフォルトの構築状態に効果的にリセットされます


3
これは、他のすべての回答と比較して、最も効率的でエレガントな方法です。ただし、std :: stringstream :: swapはc ++ 11の機能であり、このソリューションは以前のc ++ 11コンパイラでは機能しません。
101010 2014年

4
まだGNU G ++ v4.8に欠けている機能、参照stackoverflow.com/questions/24429441/...
ヨアヒム・W

7
@ 101010:スワッピングは移動割り当てよりも優れていますか?
Deduplicator

2
@AsetD:それが例外でないとしても、デフォルトで構築された一時的なものを忘れましたか?
デデュプリケータ2017年

3
これは低効率です。オリジナルのSSを再利用したいとき。それは私のために空を交換します。
Zhang


33

これは、コンパイラーに関係なく最も信頼できる方法です。

m=std::stringstream();

2
m.str( "");なので、これは私の意見ではより優れています。私が試したものは何でも、文字列ストリームがその空の値で動かなくなる。しかし、これを使用しても問題はありません
ゼラチン1 2014年

3
私はmm.clear(); mm.str("");トリックをしたので、私は同じ問題に遭遇しました。(C ++ 11がなければ、スワップがより良いでしょう)。
hochl 2015

1
@hochl:swap移動割り当てよりも優れているのはなぜですか?
Deduplicator

4
すべての状況に適しているわけではありません。これにより、毎回バッファが再割り当てされますが、mm.str( "")はそうではありません。
Shital Shah、

3
文字列ストリームオブジェクトをフラッシュするための私の主な使用例は、文字列ストリームの不要なインスタンス化を防ぐために、スレッドローカル文字列ストリームオブジェクトを保持します-新しい文字列オブジェクトのインスタンス化はグローバルロケールオブジェクトをコピーします-理論的にはこれは迅速であり、アトミックのインクリメントのみを含みますが、私が扱う並行性のレベルでは、それはしばしば障害を引き起こします。
Spacemoose 2017年

12

私は常にそれを調べています:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

1
これはstringstream?
Robur_131を

11

私の2セント:

これは私にとってxcodeとdev-c ++で機能するように見えましたが、ユーザーの要求に従って繰り返し実行されると、コードが初めて機能する文字列ストリーム変数を埋めるメニュー形式のプログラムがありました実行されますが、次回ユーザーが同じコードを実行するときに文字列ストリームはクリアされません。しかし、以下の2行のコードは、文字列変数を埋める前に毎回ようやくstringstream変数をクリアしました。(2時間の試行錯誤とグーグル検索)ところで、各行を自分で使用してもうまくいきません。

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";

-1

それは概念的な問題です。

Stringstreamはストリームであるため、そのイテレータは順方向であり、返すことはできません。他の出力ストリームと同様に、出力文字列ストリームでは、flush()を使用して再初期化する必要があります。


2
en.cppreference.com/w/cpp/io/basic_ostream/flush flushは、関連付けられているストレージデバイスと同期します。これは同じ再初期化ではありません。
2014年

-12

これらはgnu c ++の文字列ストリームのデータを破棄しません

    m.str("");
    m.str() = "";
    m.str(std::string());

以下は私のために文字列ストリームを空にします:

    m.str().clear();

7
bernhardruschが機能しないのと同じ理由で、これが機能するかどうかはわかりません。.str()関数はコピーを返し、コピーをクリアしても何も起こりません。
Verdagon 2013年

1
このソリューションは、Microsoft Visual C ++では機能しません。
Zak

不正解です。Clearは、ストリーム自体ではなく、ストリームから返された文字列を操作します。
Joey Carson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.