[英]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.