2

私の知る限り、フラグappは各書き込みの前 に終了をシークしますconst ios_base :: openmode std :: ios_base ::app[static]各書き込みの前に終了をシークします。

次のプログラム出力は次のとおりです。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

C++03 では文字列ストリームに対してフラグの動作がios_base::ate明示的に指定されていませんでしたが、C++1 では詳細な文字列ストリーム固有の効果が追加されましたのような詳細を追加しなかったios_base::appため、一部のコンパイラはそれを実装することを気にしませんでした。

于 2012-10-18T02:17:47.637 に答える
2

はい、そうすべきだと思います。少なくとも私には、これはコンパイラ (または技術的にはライブラリ) のバグのように見えます。

簡単なチェックを行うと、g++ (4.7.1) は同意しているt2: 123456789recostreamようです。期待どおりに生成されます。

于 2012-10-18T01:57:26.457 に答える