文件上的多个ostream产生不同的输出顺序

时间:2017-11-20 02:43:43

标签: c++ fstream 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

为什么会这样?不应该是第一个然后是第二个吗?

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

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

1 个答案:

答案 0 :(得分:1)

这与您{陌生的.close()的订单有关。

首先,您要以追加模式打开文件,然后缓冲&#39;首先,&#39;但是这还没有到达文件。

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

然后,再次打开文件,缓冲&#39;其次,&#39;关闭文件,并实际将缓冲区放入文件中。

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

最后,您在主函数中执行o.close();,将包含&#39; First&#39;的第一个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()强制将缓冲区移动到文件中。