gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:54:54 25 4
gpt4 key购买 nike

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

关于c++ - 文件上的多个 ostream 产生不同的输出顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47384358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com