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

Setting the content of a std::stringstream with str(const char*) has strange consequences

我广泛使用 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;

输出:

Setting string

adding to string

预计:

Setting string

Setting string adding to string

所以在阅读了一些文档之后我发现我应该将打开模式设置为 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;

输出:

Setting string

Setting string

再次(或现在)我希望:

Setting string

Setting string adding to string

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

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

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

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

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

Live Demo

或者,使用 std::ostringstream,它使用 out | mode.

初始化内部 std::stringbuf 子对象
std::ostringstream("Setting string", std::ios_base::ate);

Live Demo

您忘记设置标志模式: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