簡體   English   中英

文件上的多個ostream產生不同的輸出順序

[英]Multiple ostream on a file produces different order of output

為什么對一個文件寫入多個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

為什么會這樣呢? 不應該是第一,然后是第二嗎?

我知道我可以通過擁有一個流並將其按引用傳遞來實現此行為,但是我很困惑是什么導致同一文件上多個流的這種行為:

#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;
}

它與.close()您的ostream的順序有關。

首先,您以附加模式打開文件,並緩沖“ First”,但這實際上尚未到達文件。

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

然后,您再次打開文件,並緩沖“第二個”,關閉文件,然后將緩沖區實際放入文件中。

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

最后,執行o.close(); 在您的主要功能中,將包含“ First”的第一個ostream輸出到文件中。 由於它是在ios::app (附加模式)中打開的,因此該文本轉到文件的末尾,創建您所看到的內容:

Second
First

更多閱讀:

文件打開模式: http : //www.dummies.com/programming/cpp/open-modes-in-c/

ostream::close()工作方式: http//www.cplusplus.com/reference/fstream/ofstream/close/

為避免將來再次發生這種情況,通常應在再次打開文件之前將其關閉,或者在首次寫入之后將其刷新后再刷新,如此處所示: http : //www.cplusplus.com/參考/ ostream的/ ostream的/沖洗/

ostream::flush()強制將緩沖區移動到文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM