如何使用std :: ends覆盖std :: ostringstream中的字符串?

时间:2014-07-09 11:17:49

标签: c++ string overwrite ostringstream

我想覆盖std::ostringstream中的字符串,但std::ends无效。这是VS2012的问题,还是我做错了什么?以下是示例代码:

std::ostringstream foo;

foo << "1,2,3,4,5,6";
std::cout << foo.str(); // prints: 1,2,3,4,5,6
foo.clear();
foo.seekp( std::ios_base::beg );
foo << "A,B,C" << std::ends;
std::cout << foo.str(); // prints: A,B,C,4,5,6 NOT just: A,B,C

编辑:

我得到了很多答案,我可以使用foo.str( std::string() )清除字符串...我知道。这个问题是从这里开始的:How to reuse an ostringstream? 我正在尝试来重新分配缓冲区。

4 个答案:

答案 0 :(得分:4)

实际上是打印

enter image description here

请注意与[NUL]对应的std::ends,并在3

之后覆盖了逗号

ostringstream::str()函数返回一个跟踪其长度的容器,并忽略任何可能的行结束字符串。

所以要获得一个尊重字符串结尾字符的格式,例如,使用通过char *获得的wchar_t*(或std::string::c_str(),如果使用unicode支持进行编译),foo.str().c_str();

答案 1 :(得分:2)

您为什么使用std::ends?它是std::ostrstream时代遗留下来的东西,它确保生成的char[]为空终止。您通常不希望在std::ostringstream上使用它。

在您提供的代码中,我认为您真正想要的是两个独立的std::ostringstream(尽管可以通过调用foo.str( "" );来清除数据。)

答案 2 :(得分:0)

如果您只想覆盖字符串内容,只需使用str(new_string)方法,如下所示:

std::ostringstream foo;

foo << "1,2,3,4,5,6";
std::cout << foo.str(); // prints: 1,2,3,4,5,6
// clear just reset error state flags
foo.clear();
// Replace the content of the stream
foo.str("A,B,C");
std::cout << foo.str(); // Should print: A,B,C

或:

// clear just reset error state flags
foo.clear();
// Clear content of the stream
foo.str("");
foo << "A,B,C";

答案 3 :(得分:0)

在第3个语句中,foo.clear()不会删除foo中的数据。 在第4个语句中,您使用文件位置指向开始。 所以下一个语句从开始获取值,因此值1,2,3被A,B,C

覆盖

而不是foo.clear()使用foo.str(&#34;&#34;);