文件上的多个 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

为什么会这样?不应该是First然后Second吗?

我知道我可以通过拥有一个流并通过引用传递它来实现这一行为,但我很困惑是什么导致了同一文件上多个流的这种行为:

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

然后,你再次打开文件,缓冲区 'Second,' 关闭文件,实际上将缓冲区放入文件中。

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/reference/ostream/ostream/flush/

ostream::flush() 强制将缓冲区移动到文件中。