C++ C++;-为什么fflush(stdout)不能与iostream一起工作?

C++ C++;-为什么fflush(stdout)不能与iostream一起工作?,c++,iostream,stdio,fflush,C++,Iostream,Stdio,Fflush,我读了关于freopen()的书,意识到如果我们为它指定stdin/stdout,即使我们使用cin/cout编码,函数也会工作 通过研究,我发现了这个链接,其中一个用户回答: 从C++标准27.3.1: 对象cin控制与对象stdin相关联的流缓冲区的输入,该对象在中声明 因此,根据标准,如果我们重定向stdin,它也将重定向cin。反之亦然,cout 在CPPFerence上也看到了类似的内容: 全局对象std::cout和std::wcout控制输出到与标准C输出流stdout关联的

我读了关于
freopen()
的书,意识到如果我们为它指定stdin/stdout,即使我们使用cin/cout编码,函数也会工作

通过研究,我发现了这个链接,其中一个用户回答:

<>从C++标准27.3.1:
对象
cin
控制与对象
stdin
相关联的流缓冲区的输入,该对象在
中声明

因此,根据标准,如果我们重定向
stdin
,它也将重定向
cin
。反之亦然,
cout

在CPPFerence上也看到了类似的内容:

全局对象std::cout和std::wcout控制输出到与标准C输出流stdout关联的实现定义类型(从std::streambuf派生)的流缓冲区

这就是它变得有点混乱的地方,因为我也在阅读有关flush的文章,并注意到fflush(stdout)根本不适用于cin/cout

例如,此示例代码不会打印任何内容:

#包括
#包括
使用名称空间std;
int main(){
ios::与stdio同步(false);
cin.tie(0);
int n;
cout>n;
}
下面的代码将打印到output.txt:

#包括
#包括
使用名称空间std;
int main(){
ios::与stdio同步(false);
cin.tie(0);
freopen(“output.txt”,“w”,stdout);
cout我的第一个问题是“为什么要”?有一个函数用于此目的,所以使用它,例如
cout.flush();


它“不起作用”的原因是用
fflush(FILE*f)
刷新的缓冲区与用于
std::ostream
的缓冲区不同(或者至少不能保证它会起作用)。很可能
std::ostream::flush()
确实调用了
fflush(FILE*)< /代码>在实现的一部分的基础文件对象上。<调用>代码> iOS::SycCyOffSydio(Stdio)(代码)>和代码> CIN。TIE(0)< /C> >“您的目的是”(1)确保C/IO流(<代码> STDUD> <代码>等)与它们的C++对应(<代码> STD::CUT< /COD> >等)不同步。和(2)确保
stdout
stdin
没有绑定(即从
stdin
读取不一定导致
stdout
被刷新)

这就是为什么在您的示例中,
fflush(stdout)
不会影响
std::cout
。您已经专门禁用了这种效果,并且可以分别缓冲这两种效果


freopen()的作用在任何与提供文件句柄同步的C++流中,是未定义的。实际上,可能有一些常用的缓冲区,这解释了你所看到的——至少是用编译器/库。但是这种行为不能用其他实现来保证。s和fflush没有,只是它依赖于实现,并且没有标准保证cstdio与iostream一起工作,所以尝试都是浪费时间。如果您想要重定向,请使用特定的编译器/库“将打印到output.txt”?我没有注意到在我的linux上使用gcc/libstdc++或clang/libc++时:循环旋转时,文件保持为空。