据我所知,在每次写作之前,标志app
寻求结束
const ios_base::openmode std::ios_base::app [static]
Seek to end before each write.
以下程序输出为: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
答案 0 :(得分:4)
这是由Josuttis今年早些时候开放的开放式缺陷LWG #2121。他的报告也以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
Mote表示没有为C ++ 03中的字符串流明确指定标志ios_base::ate
的行为,而是C ++ 11 added详细的字符串流特定效果。它没有为ios_base::app
添加此类详细信息,因此有些编译器没有为实现它而烦恼。
答案 1 :(得分:2)
是的,我认为应该 - 至少在我看来这看起来像编译器(或技术上的)库。
快速检查,g ++(4.7.1)似乎同意 - 它按预期生成t2: 123456789recostream
。