我正在尝试将iostream添加到遗留代码中,因此希望同步这两个库。 根据这个article,我应该使用std :: ios_base :: sync_with_stdio。
现在,我想知道它是如何在实践中使用的(请举例说明),我应该注意的副作用。
THX
答案 0 :(得分:8)
默认情况下,流是同步的,它保证按标准工作,您无需执行任何操作。如果您愿意,sync_with_stdio
仅用于禁用同步。
从您提到的文章:
对于预定义的流,它是安全的 混合stdio和iostreams。对于 例如,您可以安全地使用stdin和 在同一个程序中; C ++ 标准保证它将起作用 你天真地期待它的方式 到。
唯一的缺点是潜在的性能损失(我想这就是为什么它可以被禁用)。
答案 1 :(得分:3)
正如TheSamFrom1984所说,synced是默认值,所以它应该不是问题。但是,只有当两个库对同一个流进行操作时,同步才有意义。这通常分别在使用cin / cout / cerr和stdin / stdout / stderr时发生。但是,除了重用遗留代码之外,我可以看到几个原因需要同时使用它们。
当我第一次开始使用C ++时,我发现自己这样做是因为我经常知道如何使用stdio做某事,但不知道如何使用iostream做,但更好的方法是找出如何做到一个或另一个,但不是两个。
答案 2 :(得分:0)
这是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
,{{1 }}和std::wcerr
。
标准C流如下:std::wclog
,stdin
和stdout
。
实际上,这意味着同步的C ++流没有缓冲,并且对C ++流的每个I / O操作都会立即应用于相应的C流的缓冲区。这样就可以自由地混合使用C ++和C I / O。
此外,同步的C ++流也保证是线程安全的(从多个线程输出的单个字符可能会交织,但不会发生数据争用)
如果关闭同步,则允许C ++标准流独立地缓冲其I / O,在某些情况下可能会更快。
默认情况下,所有八个标准C ++流均与它们各自的C流同步。
如果在标准流上发生I / O之后调用此函数,则行为是实现定义的:实现范围从无效到破坏读取缓冲区。
示例:
stderr
输出:
#include <iostream>
#include <cstdio>
int main()
{
std::ios::sync_with_stdio(false);
std::cout << "a\n";
std::printf("b\n");
std::cout << "c\n";
}
来源: cppreference