std::flush
From cppreference.com
| ヘッダ <ostream>で定義 |
||
| template< class CharT, class Traits > std::basic_ostream<CharT, Traits>& flush( std::basic_ostream<CharT, Traits>& os ); |
||
出力シーケンス os を、os.flush() を呼び出したかのようにフラッシュします。
これは出力専用のI/Oマニピュレータです。std::basic_ostream 型の任意の out に対して、out << std::flush のような式で呼び出すことができます。
目次 |
[編集] 注釈
このマニピュレータは、例えば長時間のプロセスからの出力を表示する場合、複数のスレッドのログアクティビティを記録する場合、または予期せずクラッシュする可能性のあるプログラムのログアクティビティを記録する場合など、不完全な行の出力を直ちに生成するために使用できます。std::system を呼び出す前に、生成されたプロセスが画面I/Oを実行する場合(Windows での std::system("pause") が一般的な例です)、std::cout の明示的なフラッシュも必要です。ほとんどの他の通常のインタラクティブI/Oシナリオでは、std::cout と共に std::endl を使用する場合、std::endl は冗長です。これは、std::cin からの入力、std::cerr への出力、またはプログラムの終了が std::cout.flush() の呼び出しを強制するためです。
完全な行の出力をフラッシュする必要がある場合は、std::endl マニピュレータを使用できます。
すべての出力操作をフラッシュする必要がある場合は、std::unitbuf マニピュレータを使用できます。
[編集] パラメータ
| os | - | 出力ストリームへの参照 |
[編集] 戻り値
os (操作後のストリームへの参照)。
[編集] 例
std::flush がない場合、出力は同じになりますが、リアルタイムで表示されない可能性があります。
このコードを実行
#include <chrono> #include <iostream> template<typename Diff> void log_progress(Diff d) { std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d) << " ... " << std::flush; } int main() { volatile int sink = 0; auto t1 = std::chrono::high_resolution_clock::now(); for (int j = 0; j < 5; ++j) { for (int n = 0; n < 10000; ++n) for (int m = 0; m < 20000; ++m) sink += m * n; // do some work auto now = std::chrono::high_resolution_clock::now(); log_progress(now - t1); } std::cout << '\n'; }
実行結果の例
567ms ... 1137ms ... 1707ms ... 2269ms ... 2842ms ...
[編集] 関連項目
| 各操作後に出力をフラッシュするかどうかを制御する (関数) | |
| '\n'を出力し、出力ストリームをフラッシュする (関数テンプレート) | |
| 基礎となるストレージデバイスと同期する ( std::basic_ostream<CharT,Traits> の public メンバ関数) |