2013-05-08 43 views
7

我写了一个简短的测试程序,看看我是否可以使用stringstream重复追加到一个字符串。为什么我必须在这里清除std :: 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? 
} 

输出1:

S0:1 
S1: 
S0_2:1 

输出2:

S0:1 
S1:2 
S0_2:1 

回答

5

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


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

在程序的第一个版本中,由于EOF状态在第一次读入s0后未被清除,所以第二次读取和第三次读取都不会成功。因此,失败的第一次读取将使s1为空,并且失败的第二次读取将使s0不变。

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

+0

谢谢。我想这是文件的地方?我想知道为什么这不是在页面上提到的。我认为在循环中使用stringstream会是一个不错的陷阱。 :) – Devolus 2013-05-08 14:32:42

+1

它来自'eofbit'的定义,即它应该在流处于输入序列末尾时设置。这在第一次阅读后成为现实。 – jxh 2013-05-08 14:41:45

相关问题