我广泛使用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
。这实际上是我正在使用的解决方法。我只是不明白观察到的行为。解决方法使我的代码更加混乱。
答案 0 :(得分:11)
std::stringstream
对象的默认开放模式为in | out
。使用其他模式会覆盖这些选项。由于无法写入流,因此插入操作符不能用于写入流。这就是str()
两次输出相同输出的原因。
您还需要在输出模式下手动打开流:
std::stringstream ssb("Setting string", std::ios_base::out | std::ios_base::ate);
或者,使用std::ostringstream
,使用std::stringbuf
初始化内部out | mode
子对象。
std::ostringstream("Setting string", std::ios_base::ate);
答案 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