首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将iostream与stdio同步

将iostream与stdio同步
EN

Stack Overflow用户
提问于 2009-10-20 23:13:25
回答 3查看 2.9K关注 0票数 4

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

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

Thx

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-20 15:20:00

默认情况下,流是同步的,它由标准保证工作,你不需要做任何事情。sync_with_stdio只在你想禁用同步的时候才在这里。

从你提到的那篇文章:

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

唯一的缺点是潜在的性能影响(我猜这就是为什么它可以被禁用)。

票数 10
EN

Stack Overflow用户

发布于 2009-10-20 23:48:04

正如TheSamFrom1984所说,同步是默认的,所以它应该不是问题。然而,只有当两个库操作相同的流时,同步才是相关的。当分别使用cin/cout/cerr和stdin/stdout/stderr时,通常会出现这种情况。但是,除了重用遗留代码之外,我看不出有什么理由需要同时使用这两种方法。

当我第一次开始使用C++时,我发现自己这样做是因为我经常知道如何使用stdio做一些事情,但不知道如何使用iostream,但更好的方法是找出如何在其中之一中做,而不是两者都做。

票数 5
EN

Stack Overflow用户

发布于 2019-11-09 02:41:20

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

静态布尔同步( bool sync_with_stdio= 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之后调用此函数,则行为是由实现定义的:实现的范围从无影响到销毁读缓冲区。

示例:

代码语言:javascript
复制
#include <iostream>
#include <cstdio>

int main()
{
    std::ios::sync_with_stdio(false);
    std::cout << "a\n";
    std::printf("b\n");
    std::cout << "c\n";
}

输出:

代码语言:javascript
复制
b
a
c

来源:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1595355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档