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

why i need clear stringstream before reuse?

例如:

#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();

但是为什么使用运算符>>后没有自动清除?

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

先读后toString >> str;。那么toStringrdstate()就是std::ios_base::eofbit,因为在读取str的过程中已经到了字符串的末尾

那么行toString << num2;并没有修改存储在toString中的字符串而是设置了toStringfailbit。这是所有 formatted output.

的标准行为

toString >> str2; 什么都不做:failbit 已经设置,并且不执行任何读取:str2 保持为空。

clear() 函数将 toStringrdstate() 重置为 std::ios_base::goodbit

>> 必须 而不是 调用 clear() 的原因是:

  1. 如果出现错误,那么必须能够使用函数bad()fail()eof()(或直接rdstate())进行测试,
  2. 并且可以多次使用运算符 >>

    #include <iostream>
    #include <sstream>
    
    int main() {
      std::stringstream sstr("10 20");
      int i, j;
      sstr >> i >> j;
      if(!sstr.fail()) {
        std::cout << i << " " << j << "\n";
        return 0;
      }
      return 1;
    }