2

次のテストコードを書きました。

int main(int argc, char* argv[]) {
    stringstream ss;
    int num;

    ss << "54321";
    ss >> num;
    ss.str("");
    ss << "12345";
    ss >> num;

    fprintf(stderr, "%d\n", num);
}

驚いたことに、結果は 54321 でした。抽出演算子 (>>) を使用して変数を正しく上書きするにはどうすればよいでしょうか?

4

2 に答える 2

8

最初の抽出の後、ストリームの最後に到達したため、eofbit取得され、2 番目の抽出が失敗しました。

int main(int argc, char* argv[]) {
    stringstream ss;
    int num;

    ss << "54321";
    ss >> num;

    // eofbit was set above,
    // we need to clear it
    ss.clear();

    ss.str("");
    ss << "12345";
    ss >> num;

    fprintf(stderr, "%d\n", num);
}

clear()2 番目の抽出を試みる前にメンバー関数を呼び出します。2 番目の問題は、自動的にリセットされない内部 get ポインターの位置です。を使用seekg()して設定します。

編集:ここで説明されているように、ストライクされたものは必要ありません。

于 2012-10-16T15:54:15.427 に答える
4

ストリームがストリームの最後に到達すると、std::ios_base::eofbit設定されます。日付を抽出しようとする前に、抽出は状態フラグが設定されているかどうかを確認し、設定されている場合は何もせず、抽出は失敗します。

std::stringstream ss;
ss << "54321";
ss >> num; // sets eof:
std::cout << "eof: " << ss.eof() << "\n";

いずれかの状態フラグが設定された後にストリームに何かを実行させるには、最初にフラグをクリアする必要があります。

ss.clear();
ss << "12345";
if (ss >> num) {
    std::cout << "num=" << num << "\n";
}
else {
    std::cout << "failed to extract a value\n";
}

個人的には、通常、出力演算子を使用して文字列ストリームのコンテンツを設定することはありません。代わりに、私は通常str()メンバーを使用しています:

std::ostringstream out; // note: this is just an output string stream
...
out.clear();            // the clear is still needed
out.str("12345");
于 2012-10-16T16:01:17.573 に答える