我想覆盖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?
我正在尝试不来重新分配缓冲区。
答案 0 :(得分:4)
实际上是打印
请注意与[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;);