命名空间
变体
操作

std::ios_base::sync_with_stdio

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

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

标准 C++ 流如下: std::cin, std::cout, std::cerr, std::clog, std::wcin, std::wcout, std::wcerrstd::wclog.

标准 C 流如下: stdin, stdoutstderr.

对于与 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 <cstdio>
#include <iostream>
 
int main()
{
    std::ios::sync_with_stdio(false);
    std::cout << "a\n";
    std::printf("b\n");
    std::cout << "c\n";
}

可能的输出

b
a
c

[编辑] 缺陷报告

以下行为更改缺陷报告被追溯应用于以前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 49 C++98 它是未指定的(1)实际返回哪个状态,以及
(2) 标准 C 和 C++ 流之间的“同步”意味着什么
两者都已指定

[编辑] 另请参见

写入标准 C 输出流 stdout
(全局对象)[编辑]
写入标准 C 错误流 stderr,未缓冲
(全局对象)[编辑]
写入标准 C 错误流 stderr
(全局对象)[编辑]