std::ios_base::sync_with_stdio
From cppreference.com
| 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 と同期されている場合、以下の関数のペアは同じ効果を持ちます。
実際には、これは同期された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 に書き込む (グローバルオブジェクト) |