Насколько я знаю флаг 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
Это открытый дефект 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
поэтому некоторые компиляторы не удосужились реализовать его.
Да, я думаю, что это должно быть — по крайней мере для меня это выглядит как ошибка компилятора (или, технически, библиотеки).
Делая быструю проверку, g ++ (4.7.1), похоже, согласен — он производит t2: 123456789recostream
как и ожидалось.