为什么我必须在这里清除std::stringstream

Why do I have to clear std::stringstream here?

本文关键字:std stringstream 清除 在这里 为什么      更新时间:2023-10-16

我编写了一个简短的测试程序,看看是否可以反复使用stringstream对字符串进行追加。

在第一个版本中,我得到了Output1,我真的不明白为什么s1是空的。我发现我必须执行ss.clear(),然后在Output2中获得预期的结果。有谁能解释一下为什么没有透明就不起作用吗?我希望,如果我反复输入数字并将它们取回字符串,我应该总是得到数字。我不确定数字是否被附加,但这不是本示例的重点。

这里:http://www.cplusplus.com/reference/sstream/stringstream/它说我可以使用任何操作,并且没有限制或要求重置字符串,我可以看到。我也不明白为什么之后我得到的输出中没有ss.clear()。

我也有点惊讶,50之后保持不变。所以流不会覆盖或重置字符串,如果它已经有内容?

我正在使用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?
 }

Output1:

S0:1
S1:
S0_2:1

Output2:

S0:1
S1:2
S0_2:1

读入s0后,流处于EOF状态。因此,除非EOF状态被清除,否则下一次读取将失败。写入流不会为您清除读状态。


编辑只是为了完成答案。该行为来自ios_base::iostateeofbit定义,该定义表示,如果流处于输入序列的末尾,则流的状态将设置该位。

在程序的第一个版本中,由于第一次读到s0后EOF状态没有被清除,因此第二次读和第三次读都不会成功。因此,失败的第一次读取使s1为空,而失败的第二次读取使s0保持不变。

在程序的第二个版本中,在第一次读入s0后清除ss,这使得第二次读入s1能够成功。然而,在第二次读取之后,流又处于EOF状态,因此第三次读取失败。这使得s0保持不变。