我正在尝试将iostream添加到旧代码中,因此希望同步这两个库。根据此article,我应该使用std :: ios_base :: sync_with_stdio。
现在,我想知道它在实践中是如何使用的(请举个例子),我应该意识到的副作用。
Thx
默认情况下,流是同步的,按标准保证可以正常工作,您无需执行任何操作。如果需要,sync_with_stdio
仅在此处禁用同步。
从您提到的文章开始:
对于预定义的流,它很安全混合stdio和iostream。对于例如,您可以安全地使用stdin和cin在同一程序中; C ++标准保证它将正常工作您天真地期望的方式到。
唯一的缺点是可能会降低性能(我想这就是为什么可以将其禁用)。
正如TheSamFrom1984所说,同步是默认设置,因此应该没有问题。但是,同步仅在两个库都在操作相同的流时才有意义。当分别使用cin / cout / cerr和stdin / stdout / stderr时,通常会发生这种情况。但是,除了重用旧版代码时,我看不出需要同时使用两者的原因。
[当我第一次开始使用C ++时,我发现自己正在这样做,因为经常我知道如何使用stdio做某事,但是不知道如何使用iostream来做,但是更好的方法是弄清楚如何一起做或另一个,但不能两者都选。
这是std::ios_base::sync_with_stdio()
的声明:
static bool sync_with_stdio( bool sync = true );
设置每个输入/输出操作后是否将标准C ++流同步到标准C流。
标准C ++流如下:std::cin
,std::cout
,std::cerr
,std::clog
,std::wcin
,std::wcout
,std::wcerr
和std::wclog
。
标准C流如下:stdin
,stdout
和stderr
。
实际上,这意味着同步的C ++流没有缓冲,并且对C ++流的每个I / O操作都会立即应用于相应的C流的缓冲区。这样就可以自由地混合使用C ++和C I / O。
此外,同步的C ++流也保证是线程安全的(从多个线程输出的单个字符可能会交织,但不会发生数据争用)
如果关闭同步,则允许C ++标准流独立地缓冲其I / O,在某些情况下这可能会更快。
默认情况下,所有八个标准C ++流都与它们各自的C流同步。
如果在标准流上发生I / O之后调用此函数,则行为是实现定义的:实现范围从无效到破坏读取缓冲区。
示例:
#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
来源:cppreference