为什么写入文件的多个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;
}
答案 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()
强制将缓冲区移动到文件中。