Dev*_*lus 7 c++ std stringstream
我写了一个简短的测试程序,看看我是否可以反复使用stringstream附加到字符串.
在第一个版本中,我得到了Output1,我真的不明白为什么s1保持为空.我发现我必须做ss.clear()然后在Output2中获得预期的结果.任何人都可以解释为什么没有明确的它不起作用?我本以为,如果我反复输入数字并将它们取回一个字符串,我应该总是得到数字.我不确定该数字是否被附加,但这不是这个例子的重点.
这里:http://www.cplusplus.com/reference/sstream/stringstream/它说我可以使用任何操作,没有限制或要求重置字符串,我可以看到.我也不明白为什么之后我得到没有ss.clear()的输出.
此外,我有点惊讶s0后来保持不变.因此,如果字符串已经包含内容,则流不会覆盖或重置字符串?
我正在使用gcc 3.4.4和cygwin.
int main()
{
std::string s0;
std::string s1;
int n = 1;
std::stringstream ss;
ss << n;
ss >> s0;
cout << "S0:" << s0 << endl;
ss.clear(); <-- If I remove this, then s1 stays empty.
n = 2;
ss << n;
ss >> s1;
cout << "S1:" << s1 << endl;
ss << n;
ss >> s0;
cout << "S0_2:" << s0 << endl; <-- Why is s0 still 1?
}
Run Code Online (Sandbox Code Playgroud)
输出1:
S0:1
S1:
S0_2:1
Run Code Online (Sandbox Code Playgroud)
输出2:
S0:1
S1:2
S0_2:1
Run Code Online (Sandbox Code Playgroud)
在读入之后s0
,流处于EOF状态.因此,除非清除EOF状态,否则下一次读取将失败.写入流不会清除您的读取状态.
编辑只是为了完成答案.
行为来自定义eofbit
的ios_base::iostate
其说,如果流在输入序列的末端流的状态将设置此位.
在程序的第一个版本中,由于在第一次读入后EOF状态未被清除s0
,因此第二次读取和第三次读取都不会成功.因此,失败的第一次s1
读取将s0
变为空,并且失败的第二次读取将保持不变.
在程序的第二个版本中,您ss
在第一次读入后清除s0
,这允许第二次读取s1
成功.但是,在第二次读取之后,流再次处于EOF状态,因此第三次读取失败.这s0
保持不变.