7

我写了一个简短的测试程序,看看我是否可以重复使用 stringstream 附加到一个字符串。

在第一个版本中,我得到了 Output1,但我真的不明白为什么 s1 保持为空。我发现我必须做 ss.clear() 然后在 Output2 中得到预期的结果。任何人都可以解释为什么它在没有明确的情况下不起作用?我本以为,如果我反复输入数字并将它们取回字符串,我应该总是得到数字。我不确定是否附加了数字,但这与此示例无关。

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

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

我在 cygwin 中使用 gcc 3.4.4。

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?
 }

输出1:

S0:1
S1:
S0_2:1

输出2:

S0:1
S1:2
S0_2:1
4

1 回答 1

5

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


编辑只是为了完成答案。 行为来自其定义,如果流位于输入序列eofbitios_base::iostate末尾,则流的状态将设置此位。

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

在您的程序的第二个版本中,您ss在第一次读入后清除s0,这允许第二次读入s1成功。但是第二次读取后,流又处于EOF状态,所以第三次读取失败。这s0保持不变。

于 2013-05-08T14:26:27.470 回答