使用 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);
或者,使用 std::ostringstream
,它使用 out | mode
.
初始化内部 std::stringbuf
子对象
std::ostringstream("Setting string", std::ios_base::ate);
您忘记设置标志模式: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
我广泛使用 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);
或者,使用 std::ostringstream
,它使用 out | mode
.
std::stringbuf
子对象
std::ostringstream("Setting string", std::ios_base::ate);
您忘记设置标志模式: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