为什么我必须在这里清除std::stringstream
Why do I have to clear std::stringstream here?
我编写了一个简短的测试程序,看看是否可以反复使用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::iostate
的eofbit
定义,该定义表示,如果流处于输入序列的末尾,则流的状态将设置该位。
在程序的第一个版本中,由于第一次读到s0
后EOF状态没有被清除,因此第二次读和第三次读都不会成功。因此,失败的第一次读取使s1
为空,而失败的第二次读取使s0
保持不变。
在程序的第二个版本中,在第一次读入s0
后清除ss
,这使得第二次读入s1
能够成功。然而,在第二次读取之后,流又处于EOF状态,因此第三次读取失败。这使得s0
保持不变。
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- std::stringstream 返回字符 *
- std::stringstream::flush() 应该做什么吗?
- 静态 std::stringstream 的叮当整警告
- 为什么 {fmt} 比 std::stringstream 慢?
- C++命令末尾的 std::stringstream 空格
- 返回 std::stringstream - 编译失败
- 流从STD :: Stringstream带有空间的流
- 用std :: stringstream inline代替字符
- C STD :: Stringstream操作优化
- What value should `std::stringstream::fail()` return after r
- 使用Boost Karma替换STD :: stringstream double到STD :: String Conv
- 从 std::stringstream 读取uint8_t为数字类型
- 重置std :: stringstream格式标志
- 如何将“char *”深度复制到std::stringstream
- 将内存缓冲区写入 std::stringstream
- 如何初始化 std::stringstream
- STD :: Stringstream一次仅支持一个输入
- 用std :: stringstream读取/写作无符号字节
- 使用std :: stringstream将boost :: int64_t转换为字符串