标志 ios_base::app 的错误行为

Wrong behavior with flag ios_base::app

本文关键字:错误 app base 标志 ios      更新时间:2023-10-16

据我所知,app在每次写入之前都寻求最后的标志 常量 ios_base::OpenMode std::ios_base::应用 [静态] 寻求在每次写入之前结束。

以下程序输出为: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

编译的代码图像

这是开放缺陷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

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

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

做一个快速检查,g++ (4.7.1) 似乎同意 - 它按预期生成t2: 123456789recostream