Namespaces
Variants

std::ios_base:: sync_with_stdio

From cppreference.net
static bool sync_with_stdio ( bool sync = true ) ;

標準C++ストリームが各入出力操作後に標準Cストリームと同期するかどうかを設定します。

標準C++ストリームは以下の通りです: std::cin std::cout std::cerr std::clog std::wcin std::wcout std::wcerr および std::wclog

標準Cストリームは以下の通りです: stdin stdout および stderr

標準ストリーム str がCストリーム f と同期されている場合、以下の関数ペアは同一の効果を持ちます:

1) std:: fputc ( f, c ) str. rdbuf ( ) - > sputc ( c )
2) std:: fgetc ( f ) str. rdbuf ( ) - > sbumpc ( )
3) std:: ungetc ( c, f ) str. rdbuf ( ) - > sputbackc ( c )

実際には、これは同期されたC++ストリームがバッファリングされず、C++ストリームに対する各I/O操作が即座に対応するCストリームのバッファに適用されることを意味します。これにより、C++とCのI/Oを自由に混在させることが可能になります。

さらに、同期されたC++ストリームはスレッドセーフであることが保証されています(複数のスレッドから出力される個々の文字は混在する可能性がありますが、データ競合は発生しません)。

同期がオフになっている場合、C++標準ストリームはそれらのI/Oを独立してバッファリングすることが許可され、場合によってはかなり高速になる可能性があります。

デフォルトでは、8つの標準C++ストリームはすべて、それぞれの対応するCストリームと同期されています。

この関数が標準ストリームでI/Oが発生した後に呼び出された場合、その動作は実装定義です:実装によっては何の効果もないものから、読み取りバッファを破棄するものまで様々です。

目次

パラメータ

sync - 新しい同期設定

戻り値

関数呼び出し前の同期状態。

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

出力例:

b
a
c

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 49 C++98 (1) 実際にどの状態が返されるか、および
(2) 標準CストリームとC++ストリーム間の「同期」の意味が未規定であった
両方とも規定された

関連項目

標準C出力ストリームへの書き込み stdout
(グローバルオブジェクト)
標準Cエラーストリームへの書き込み stderr 、バッファリングなし
(グローバルオブジェクト)
標準Cエラーストリームへの書き込み stderr
(グローバルオブジェクト)