Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 输出缓冲区何时刷新?_C++_C - Fatal编程技术网

C++ 输出缓冲区何时刷新?

C++ 输出缓冲区何时刷新?,c++,c,C++,C,除了手动调用flush外,cout或STDOUT(printf)将刷新的条件是什么 退出当前作用域或当前功能?它是定时的吗?缓冲区满时刷新(以及缓冲区有多大)?对于流,可以使用setvbuf()设置缓冲模式。它采用三种缓冲模式: \u IOFBF:缓冲区已满或明确请求刷新时,将刷新缓冲区 \u IOLBF:当发现换行符、缓冲区已满或请求刷新时,缓冲区将被刷新 \u IONBF:流是无缓冲的,即输出在可用时立即发送 我印象深刻的是,stdout的默认设置是\u IOLBF,stderr的默认设置是

除了手动调用flush外,
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
  • <> LI>几乎忘记了一个重要的问题:如果:代码> STOD::/SCOCYSO STDIOOR():未被调用<代码> false 标准的C++流(<代码> STD:CIN < /代码>,<代码> STD::CUT, STD::CURR 和 STD::Culg < /Calp>及其<代码> WCARYTT 对应)可能完全没有缓冲!默认设置为<代码> STD::IOSKBASE::SycSyOSySTIO(TRUE)< /C> >标准C和C++流可以混合使用。但是,由于C库通常忽略C++库,这意味着C++标准流对象不能进行任何缓冲。使用<代码> STD::SycSysOSdidio(true)是标准C++流对象的主要性能问题!<李>
    <> 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
    ,使文件流无缓冲。