例如:
#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();
但是为什么在使用运算符>>
后它不会自动清除?
答案 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
的原因是:
std::ios_base::goodbit
,>>
,clear()
(或直接bad()
)对其进行测试,可以多次使用运算符fail()
:
eof()