4

ofstream の奇妙な動作に出くわしました。これが私のプログラムです。Visual Studio 2010 Express Edition を使用しています。

int main () {

    std::ofstream file("file.txt");
    file << "something1";
    file.close();

    file.open("file.txt", std::ios::ate | std::ios::in );
    file << "something2";
    file.close();

    return 0;
}

これにより、正しい出力が生成されます。

何か1何か2

9行目を次のコードに置き換えると、

file.open("file.txt", std::ios::ate);

私はこの出力を取得します。

何か2

しかし、9行目をもう一度置き換えると、今度はこのコードで、

file.open("file.txt", std::ios::ate | std::ios::in );

私はこの出力を取得します。

何か1何か2

さて、問題は、誰かがこれを理解するのを手伝ってくれるだろうか? 最後のソリューションは機能するのに、中間のソリューションは機能しないのはなぜですか。

編集:メイン関数を修正しました。あなたは毎日何かを学びます。

4

1 に答える 1

7

An ofstreamdefaults to std::ios::trunc-- 既存のコンテンツを切り捨てるフラグ。渡すとstd::ios::in切り捨てが無効になります (truncフラグも指定されていない場合)。

実際には、ルールは、フラグが使用されている場合、またはフラグが使用されていてどちらでもない場合fstreamに切り捨てを実行するというものです(通知は とは異なり、すべての書き込みを再配置しますが、初期ポインターにのみ影響します)。 自動的に設定します。 なしでは使用できません。truncoutinappappateappateofstreamouttruncout

于 2012-06-04T00:43:57.513 に答える