为什么我需要在重用之前清除stringstream?

时间:2015-01-12 16:51:46

标签: c++ stringstream

例如:

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

int main() {
    int num = 10;
    string str;
    stringstream toString;
    toString << num;
    toString >> str;
    cout << str << "\n"; //10

    int num2 = 20;
    string str2;
    toString << num2;
    toString >> str2;
    cout << str2 << "\n"; //str2 is empty
    return 0;
}

我知道我必须清楚这一点:

toString.str("");
toString.clear();

但是为什么在使用运算符>>后它不会自动清除?

2 个答案:

答案 0 :(得分:6)

如果我toString >> a >> b >> c并且第一个失败,我不希望清除该标志,以便最终状态似乎已成功。

答案 1 :(得分:1)

第一次阅读toString >> str;之后。然后rdstate()的{​​{1}}为toString,因为在阅读std::ios_base::eofbit期间,已达到字符串的结尾。

然后,行str不会修改toString << num2;中存储的字符串,而是设置toString的{​​{1}}。这是所有formatted output的标准行为。

failbit不执行任何操作:toString已设置,且未执行任何读取:toString >> str2;保持为空。

clear()功能会将failbit的{​​{1}}重置为str2

rdstate()必须调用toString的原因是:

  1. 如果出现错误,则必须能够使用函数std::ios_base::goodbit>>clear()(或直接bad())对其进行测试,
  2. 可以多次使用运算符fail()

    eof()