1

我想覆盖其中的字符串,std::ostringstreamstd::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() )用来清除字符串的答案......我知道。这个问题是从这里衍生出来的:如何重用 ostringstream? 我试图重新分配缓冲区。

4

4 回答 4

4

实际上它打印

在此处输入图像描述

注意[NUL]which 对应于 thestd::ends并且在 the 之后覆盖了逗号3

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

因此,要获得尊重字符串结尾字符的格式,您可以例如使用通过这样获得的char *(或者wchar_t*如果使用 unicode 支持编译)表示std::string::c_str()foo.str().c_str();

于 2014-07-09T11:26:49.470 回答
2

你为什么用std::ends?这是从 的日子遗留下来的东西std::ostrstream,它确保生成的内容char[]是空终止的。您通常不想在std::ostringstream.

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

于 2014-07-09T11:27:40.403 回答
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";
于 2014-07-09T11:32:20.520 回答
0

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

代替 foo.clear() 使用 foo.str("");

于 2014-07-09T11:36:56.230 回答