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