我正在尝试将iostream添加到遗留代码中,因此希望同步这两个库。根据这个article,我应该使用std::ios_base::sync_with_stdio。
现在,我想知道它是如何在实践中使用的(请举例说明),我应该知道的副作用。
Thx
发布于 2009-10-20 15:20:00
默认情况下,流是同步的,它由标准保证工作,你不需要做任何事情。sync_with_stdio只在你想禁用同步的时候才在这里。
从你提到的那篇文章:
对于预定义的流,混合stdio和iostream是安全的。例如,您可以在同一个程序中安全地使用标准输入和cin;C++标准保证它将以您天真地期望的方式工作。
唯一的缺点是潜在的性能影响(我猜这就是为什么它可以被禁用)。
发布于 2009-10-20 23:48:04
正如TheSamFrom1984所说,同步是默认的,所以它应该不是问题。然而,只有当两个库操作相同的流时,同步才是相关的。当分别使用cin/cout/cerr和stdin/stdout/stderr时,通常会出现这种情况。但是,除了重用遗留代码之外,我看不出有什么理由需要同时使用这两种方法。
当我第一次开始使用C++时,我发现自己这样做是因为我经常知道如何使用stdio做一些事情,但不知道如何使用iostream,但更好的方法是找出如何在其中之一中做,而不是两者都做。
发布于 2019-11-09 02:41:20
这是std::ios_base::sync_with_stdio()的声明
静态布尔同步( bool sync_with_stdio= true );
它设置在每次输入/输出操作后是否将标准C++流同步到标准C流。
标准C++流如下:std::cin、std::cout、std::cerr、std::clog、std::wcin、std::wcout、std::wcerr和std::wclog。
标准的C流如下:stdin、stdout和stderr。
实际上,这意味着同步的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来源:
https://stackoverflow.com/questions/1595355
复制相似问题