使用str(const char *)设置std :: stringstream的内容会产生奇怪的后果

时间:2015-06-17 18:24:23

标签: c++ c++11 stringstream

我广泛使用std::stringstream来生成代码。在使用str()函数设置内容,然后使用operator<<时,我遇到了一些奇怪的行为。有人可以向我解释这种行为。我非常感谢 - 谢谢。

示例一:

std::stringstream ssa;
ssa.str("Setting string");
std::cout << ssa.str() << std::endl;
ssa << " adding to string";
std::cout << ssa.str() << std::endl;

输出:

  

设置字符串

     

添加到字符串

预期:

  

设置字符串

     

设置字符串添加到字符串

因此,在阅读完文档之后,我发现我应该将开放模式设置为ios_base::ate

std::stringstream ssb(std::ios_base::ate);
ssb.str("Setting string");
std::cout << ssb.str() << std::endl;
ssb << " adding to string";
std::cout << ssb.str() << std::endl;

输出:

  

设置字符串

     

设置字符串

我希望再次(或现在):

  

设置字符串

     

设置字符串添加到字符串

为什么我会得到我的结果,我如何得到我想要的结果? E.I.能够设置string的初始stringstream和附加到string吗?

我知道我可以将内容设置为空string(""),然后只使用<<operator。这实际上是我正在使用的解决方法。我只是不明白观察到的行为。解决方法使我的代码更加混乱。

2 个答案:

答案 0 :(得分:11)

std::stringstream对象的默认开放模式为in | out。使用其他模式会覆盖这些选项。由于无法写入流,因此插入操作符不能用于写入流。这就是str()两次输出相同输出的原因。

您还需要在输出模式下手动打开流:

std::stringstream ssb("Setting string", std::ios_base::out | std::ios_base::ate);

Live Demo

或者,使用std::ostringstream,使用std::stringbuf初始化内部out | mode子对象。

std::ostringstream("Setting string", std::ios_base::ate);

Live Demo

答案 1 :(得分:6)

您忘记设置标记模式:std::ios_base::out。 这将有效:

std::stringstream ssb(std::ios_base::out | std::ios_base::ate);
ssb.str("Setting string");
std::cout << ssb.str() << std::endl;
ssb << " adding to string";
std::cout << ssb.str() << std::endl;

输出:

Setting string
Setting string adding to string