2

据我所知,标志app在每次写入之前寻求结束 const ios_base::openmode std::ios_base::app [静态] 在每次写入之前寻求结束。

以下程序输出为:recostream789

std::string str("t2: 123456789");
std::ostringstream ostr(str,std::ios_base::out|std::ios_base::app);
ostr << "recostream";
std::cout << ostr.str() << std::endl;

它不应该输出:t2: 123456789recostream而是?

我用的是vs2010

编译后的代码图片

4

2 回答 2

4

这是开放缺陷LWG #2121,由 Josuttis 今年早些时候公开。他的报告也使用 GCC 和 Visual Studio 作为示例,引用:

请注意以下程序:

string s("s1: 123456789");
ostringstream s1(s, ios_base::out|ios_base::app);
s1 << "hello";
cout << s1.str() << endl;

使用 g++4.x 打印:

s1: 123456789hello

使用 VisualC++10 打印:

hello23456789

注意到ios_base::ate在 C++03 中没有为字符串流明确指定标志的行为,但 C++11为其添加了详细的字符串流特定效果。它没有为 . 添加这样的细节ios_base::app,所以一些编译器并没有费心去实现它。

于 2012-10-18T02:17:47.637 回答
2

是的,我认为它应该——至少对我来说这看起来像一个编译器(或者,从技术上讲,库)错误。

快速检查一下,g++ (4.7.1) 似乎同意——它t2: 123456789recostream按预期产生。

于 2012-10-18T01:57:26.457 回答