2017-11-20 23 views
0

ファイルに複数のostreamが異なる出力順序を生成するのはなぜですか?たとえば、次のようにファイルの複数のostreamは異なる出力順序を生成します

#include <iostream> 
#include <fstream> 
using namespace std; 

void writeTo(string filename){ 
    ostream o; 
    o.open(filename, ios::app); 
    o << "Second\n"; 
    o.close(); 
} 

int main(){ 
    ostream o; 
    o.open("foo.txt", ios::app); 
    o << "First\n"; 
    writeTo("foo.txt"); 
    o.close(); 
    return 0; 
} 

出力ファイルが

Second 
First 

なぜこのような場合はありますか?それは最初から2番目ではないでしょうか?

私は私は1つのストリームを持つ、そのように参照することによって、それを渡すことによって、この動作を実現することができます知っているが、私は、同じファイルに複数のストリームのこの動作を引き起こすもの困惑している:

#include <iostream> 
#include <fstream> 
using namespace std; 

void writeTo(ostream& o){ 
    o << "Second\n"; 
} 

int main(){ 
    ostream o; 
    o.open("foo.txt", ios::app); 
    o << "First\n"; 
    writeTo(o); 
    o.close(); 
    return 0; 
} 
+0

関数内の 'ostream'は' main() 'の前に破壊されていますので、まずバッファをフラッシュします。 – cantordust

+0

@cantordust興味深い、あなたはそれを引用していただけますか? – Miket25

+1

明示的に 'close()'を呼んでいるので、技術的にはバッファはストリームが破棄される前にフラッシュされますが、デストラクタは 'close()'を呼び出すので無関係です。 '[...]は最初にオーバーフロー(Traits :: eof())を呼び出し、すべての保留中の出力をファイルに書き出します(Traits :: eof())。ファイル[...] '。 'main()'で 'writeTo(" foo.txt ");を呼び出す前に' o.close() '**を呼び出すと、' First'の後に 'Second'が続くはずです。 – cantordust

答えて

1

それが持っていますご注文は.close() ostreamsです。

最初に、ファイルを追加モードで開き、 'First'をバッファリングしていますが、まだ実際にファイルに到達していません。

ostream o; 
o.open("foo.txt", ios::app); 
o << "First\n"; 

次に、ファイルをもう一度開き、「第2の」バッファを閉じてファイルを閉じ、実際にバッファをファイルに入れます。

ostream o; 
o.open(filename, ios::app); 
o << "Second\n"; 
o.close(); 

最後に、あなたはファイルの中に、「最初の」に含まれる最初のostreamを、出力、あなたのメイン機能でo.close();を行います。それは(モードを追加)ios::appにオープンして以来、そのテキストはあなたが見たものを作成し、ファイルの末尾に行く:

Second 
First 

もっと読み:

ファイルオープニングモード:http://www.dummies.com/programming/cpp/open-modes-in-c/

方法http://www.cplusplus.com/reference/fstream/ofstream/close/

これを避けるには、ファイルをもう一度開く前に閉じておくか、最初に書き込んだ後にファイルを書き戻す必要があります。ここに示すように:http://www.cplusplus.com/reference/ostream/ostream/flush/

ostream::flush()バッファを強制的にファイルに移動します。

関連する問題