4

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

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

谢谢

4

3 回答 3

10

默认情况下,流是同步的,保证按标准工作,您不必做任何事情。sync_with_stdio如果您愿意,这里只是为了禁用同步。

从您提到的文章中:

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

唯一的缺点是潜在的性能损失(我想这就是它可以被禁用的原因)。

于 2009-10-20T15:19:59.883 回答
5

正如 TheSamFrom1984 所说,同步是默认设置,所以它不应该是一个问题。但是,仅当两个库都在操作相同的流时,同步才相关。这通常在分别使用 cin/cout/cerr 和 stdin/stdout/stderr 时发生。但是,除了重用遗留代码之外,我看不出需要同时使用两者的原因。

当我第一次开始使用 C++ 时,我发现自己这样做是因为我经常知道如何使用 stdio 来做某事,但不知道如何使用 iostream 来做,但更好的方法是弄清楚如何在一个或其他,但不是两者兼而有之。

于 2009-10-20T15:48:04.193 回答
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,std::wcerrstd::wclog.

标准 C 流如下:stdinstdoutstderr.

实际上,这意味着同步的 C++ 流是无缓冲的,并且 C++ 流上的每个 I/O 操作都会立即应用于相应的 C 流的缓冲区。这使得自由混合 C++ 和 CI/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

于 2019-11-08T18:41:19.957 回答