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++时:循环旋转时,文件保持为空。