为什么我需要在重用之前清除 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;
。那么toString
的rdstate()
就是std::ios_base::eofbit
,因为在读取str
的过程中已经到了字符串的末尾
那么行toString << num2;
并没有修改存储在toString
中的字符串而是设置了toString
的failbit
。这是所有 formatted output.
的标准行为
行 toString >> str2;
什么都不做:failbit
已经设置,并且不执行任何读取:str2
保持为空。
clear()
函数将 toString
的 rdstate()
重置为 std::ios_base::goodbit
。
>>
必须 而不是 调用 clear()
的原因是:
- 如果出现错误,那么必须能够使用函数
bad()
、fail()
、eof()
(或直接rdstate()
)进行测试,
并且可以多次使用运算符 >>
:
#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;
}
例如:
#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;
。那么toString
的rdstate()
就是std::ios_base::eofbit
,因为在读取str
的过程中已经到了字符串的末尾
那么行toString << num2;
并没有修改存储在toString
中的字符串而是设置了toString
的failbit
。这是所有 formatted output.
行 toString >> str2;
什么都不做:failbit
已经设置,并且不执行任何读取:str2
保持为空。
clear()
函数将 toString
的 rdstate()
重置为 std::ios_base::goodbit
。
>>
必须 而不是 调用 clear()
的原因是:
- 如果出现错误,那么必须能够使用函数
bad()
、fail()
、eof()
(或直接rdstate()
)进行测试, 并且可以多次使用运算符
>>
:#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; }