将iostream与stdio同步

时间:2009-10-20 15:13:25

标签: c++ c stl io legacy-code

我正在尝试将iostream添加到遗留代码中,因此希望同步这两个库。 根据这个article,我应该使用std :: ios_base :: sync_with_stdio。

现在,我想知道它是如何在实践中使用的(请举例说明),我应该注意的副作用。

THX

3 个答案:

答案 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::cinstd::coutstd::cerrstd::clogstd::wcinstd::wcout,{{1 }}和std::wcerr

标准C流如下:std::wclogstdinstdout

实际上,这意味着同步的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