C++ 输出缓冲区何时刷新?
除了手动调用flush外,C++ 输出缓冲区何时刷新?,c++,c,C++,C,除了手动调用flush外,cout或STDOUT(printf)将刷新的条件是什么 退出当前作用域或当前功能?它是定时的吗?缓冲区满时刷新(以及缓冲区有多大)?对于流,可以使用setvbuf()设置缓冲模式。它采用三种缓冲模式: \u IOFBF:缓冲区已满或明确请求刷新时,将刷新缓冲区 \u IOLBF:当发现换行符、缓冲区已满或请求刷新时,缓冲区将被刷新 \u IONBF:流是无缓冲的,即输出在可用时立即发送 我印象深刻的是,stdout的默认设置是\u IOLBF,stderr的默认设置是
cout
或STDOUT(printf)
将刷新的条件是什么
退出当前作用域或当前功能?它是定时的吗?缓冲区满时刷新(以及缓冲区有多大)?对于
流,可以使用setvbuf()
设置缓冲模式。它采用三种缓冲模式:
\u IOFBF
:缓冲区已满或明确请求刷新时,将刷新缓冲区\u IOLBF
:当发现换行符、缓冲区已满或请求刷新时,缓冲区将被刷新\u IONBF
:流是无缓冲的,即输出在可用时立即发送stdout
的默认设置是\u IOLBF
,stderr
的默认设置是\u iobf
,而其他流的默认设置是\u IOFBF
。然而,查看C标准,我没有发现任何关于任何C流的默认值的指示
对于标准的C++流对象,没有等价的代码> > IOBBF :如果您想要行缓冲区,则使用<代码> STD::EntL\/Cube >或“优选地,<代码> > \n′/COD>和<代码> STD::FLUSS。对于
std::ostream
,有一些设置,不过:
buf.pubstebuf(0,0)
将流转换为无缓冲。由于流缓冲区可以由用户实现,因此不能保证设置缓冲区的相应调用得到遵守std::ios_base::unitbuf
,这会导致在每次[正确执行]输出操作后刷新流。默认情况下,仅为std::cerr
设置std::ios\u base::unitbuf
std::ostream
刷新缓冲区的正常设置,不幸的是,std::endl
发出了刷新缓冲区的明确请求(在许多情况下会导致性能问题,因为它往往被用作未被使用的'\n'
的替代项)in.tie()
输入流的输出缓冲区:如果in.tie()
包含指向std::ostream
的指针,则在尝试读取in
中的之前,将刷新此输出流(当然,假设正确实现了输入运算符)。默认情况下,std::cout
是tie()
d到std::cin
<> P>既不在C中,也不在C++中,可以真正控制缓冲区的大小:允许设置非零缓冲区的请求被忽略,通常会被忽略。也就是说,流几乎会在一些随机的地方被刷新。对于C和stdio,通常是在看到换行符(“\n”)时。我不能和CUT或C++对话。CharlieBurns,我不认为这是<代码> CUT<代码>的原因。它是实现定义的。它是依赖于平台的。请参阅,例如,如果您混合使用cout和stdout,答案是:未定义。您能给我指出
out.setbuf
的引用吗?我在cpp文档中找不到它…@texasbruce:它是std::streambuf
上的一个函数。您可以使用out.rdbuf()
获取流的流缓冲区。是否可以将out.setbuf
更改为buf.setbuf
?我想,out
指的是输出流。。。另外,由于unitbuf
是流的常数,因此我无法将其更改为cout
对吗?显然,从本页cin.tie
到cout
。。。所以每次cin
获取数据时,它都会刷新cout缓冲区。。interesting@texasbruce:实际上,std::streambuf::setbuf()
是virtual
函数(不过它应该指定合同)。调用流缓冲区的公共缓冲区是std::streambuf::pubsetbuf()。请注意,在预定义流(尤其是std::filebuf
)上调用它的唯一可移植参数是0,0
,使文件流无缓冲。