std::ios_base::sync_with_stdio

来自cppreference.com
< cpp‎ | io‎ | ios base
static bool sync_with_stdio( bool sync = true );

设置标准 C++ 流是否与标准 C 流在每次输入/输出操作后同步。

标准 C++ 流为下列者: std::cinstd::coutstd::cerrstd::clogstd::wcinstd::wcoutstd::wcerrstd::wclog

标准 C 流为下列者: stdinstdoutstderr

对于与 C 流 f 同步的标准流 str ,下列函数对拥有等同的效果:

1) std::fputc(f, c)str.rdbuf()->sputc(c)
2) std::fgetc(f)str.rdbuf()->sbumpc()
3) std::ungetc(c, f)str.rdbuf()->sputbackc(c)

实践中,这表示同步的 C++ 流为无缓冲,而每次 C++ 流上的 I/O 都立即应用到对应 C 流的缓冲区。这使得能自由地混合 C++ 与 C I/O 。

另外,同步的 C++ 流保证为线程安全(从多个线程输出的单独字符可能交错,但无数据竞争)。

若关闭同步,则允许 C++ 标准流独立地缓冲其 I/O ,可认为这在某些情况下更快。

所有八个标准 C++ 流默认与其相应的 C 流同步。

若在标准流上已出现 I/O 后调用此函数,则行为是实现定义的:有的实现无效果,有的实现销毁读取缓冲区。

参数

sync - 新的同步设置

返回值

调用函数前的同步状态

示例

#include <iostream>
#include <cstdio>
 
int main()
{
    std::ios::sync_with_stdio(false);
    std::cout << "a\n";
    std::printf("b\n");
    std::cout << "c\n";
}

可能的输出:

b
a
c

参阅

写入到标准 C 输出流 stdout
(全局对象)
写入到标准 C 错误流 stderr, 无缓冲
(全局对象)
写入到标准 C 错误流 stderr
(全局对象)