私はすでにいくつかのことを試しました、
std::stringstream m;
m.empty();
m.clear();
どちらも機能しません。
私はすでにいくつかのことを試しました、
std::stringstream m;
m.empty();
m.clear();
どちらも機能しません。
回答:
すべての標準ライブラリタイプで、メンバー関数empty()
はコマンドではなくクエリです。つまり、「空ですか?」「内容を捨ててください」ではありません。
clear()
メンバ関数から継承されるios
と、ファイルストリームはにエラー状態が設定されている場合例えば、ストリームのエラー状態をクリアするために使用されているeofbit
(ファイルの終端)、その後、呼び出し元clear()
にエラー状態をバックに設定されますgoodbit
(エラーなし) 。
の内容をクリアするにはstringstream
、次を使用します:
m.str("");
正しいですが、以下を使用しています:
m.str(std::string());
std::string
を取るコンストラクタを呼び出さないため、技術的にはより効率的ですconst char*
。しかし、最近のコンパイラーはどちらの場合でも同じコードを生成できるはずです。そのため、私はより読みやすいものを使用します。
エラー状態をクリアし、文字列ストリームをすべて1行で空にすることができます
std::stringstream().swap(m); // swap m with a default constructed stringstream
これにより、mがデフォルトの構築状態に効果的にリセットされます
これは、コンパイラーに関係なく最も信頼できる方法です。
m=std::stringstream();
mm.clear(); mm.str("");
トリックをしたので、私は同じ問題に遭遇しました。(C ++ 11がなければ、スワップがより良いでしょう)。
swap
移動割り当てよりも優れているのはなぜですか?
私は常にそれを調べています:
{
std::stringstream ss;
ss << "what";
}
{
std::stringstream ss;
ss << "the";
}
{
std::stringstream ss;
ss << "heck";
}
stringstream?
私の2セント:
これは私にとってxcodeとdev-c ++で機能するように見えましたが、ユーザーの要求に従って繰り返し実行されると、コードが初めて機能する文字列ストリーム変数を埋めるメニュー形式のプログラムがありました実行されますが、次回ユーザーが同じコードを実行するときに文字列ストリームはクリアされません。しかし、以下の2行のコードは、文字列変数を埋める前に毎回ようやくstringstream変数をクリアしました。(2時間の試行錯誤とグーグル検索)ところで、各行を自分で使用してもうまくいきません。
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
それは概念的な問題です。
Stringstreamはストリームであるため、そのイテレータは順方向であり、返すことはできません。他の出力ストリームと同様に、出力文字列ストリームでは、flush()を使用して再初期化する必要があります。
これらはgnu c ++の文字列ストリームのデータを破棄しません
m.str("");
m.str() = "";
m.str(std::string());
以下は私のために文字列ストリームを空にします:
m.str().clear();