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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

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;

产出:

设置字符串 设置字符串

我再次(或现在)期望:

设置字符串 设置添加到字符串的字符串

为什么我要得到我想要的结果,我怎么得到我想要的结果?埃岛。能够设置初始string一种stringstream以及附加在string

string("")然后只使用<<operator

提问于
用户回答回答于

忘记设置标志模式: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对象是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);

扫码关注云+社区