同步iostream与stdio

问题描述 投票:3回答:3

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

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

Thx

c++ c stl io legacy-code
3个回答
9
投票

默认情况下,流是同步的,按标准保证可以正常工作,您无需执行任何操作。如果需要,sync_with_stdio仅在此处禁用同步。

从您提到的文章开始:

对于预定义的流,它很安全混合stdio和iostream。对于例如,您可以安全地使用stdin和cin在同一程序中; C ++标准保证它将正常工作您天真地期望的方式到。

唯一的缺点是可能会降低性能(我想这就是为什么可以将其禁用)。


4
投票

正如TheSamFrom1984所说,同步是默认设置,因此应该没有问题。但是,同步仅在两个库都在操作相同的流时才有意义。当分别使用cin / cout / cerr和stdin / stdout / stderr时,通常会发生这种情况。但是,除了重用旧版代码时,我看不出需要同时使用两者的原因。

[当我第一次开始使用C ++时,我发现自己正在这样做,因为经常我知道如何使用stdio做某事,但是不知道如何使用iostream来做,但是更好的方法是弄清楚如何一起做或另一个,但不能两者都选。


0
投票

这是std::ios_base::sync_with_stdio()的声明:

static bool sync_with_stdio( bool sync = true );

设置每个输入/输出操作后是否将标准C ++流同步到标准C流。

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

标准C流如下:stdinstdoutstderr

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

© www.soinside.com 2019 - 2024. All rights reserved.