Namespaces
Variants

std:: flush

From cppreference.net
< cpp ‎ | io ‎ | manip
ヘッダーで定義 <ostream>
template < class CharT, class Traits >
std:: basic_ostream < CharT, Traits > & flush ( std:: basic_ostream < CharT, Traits > & os ) ;

出力シーケンス os をフラッシュします。これは os. flush ( ) を呼び出すのと同様です。

これは出力専用のI/Oマニピュレータであり、 out << std :: flush のような式で、 out std::basic_ostream 型の任意の出力ストリームに対して呼び出すことができます。

目次

注記

このマニピュレータは、不完全な出力行を即座に生成するために使用できます。例えば、長時間実行されるプロセスの出力を表示する場合、複数スレッドのログ活動、または予期せずクラッシュする可能性のあるプログラムのログ活動などです。また、生成されたプロセスが画面I/Oを実行する場合(一般的な例はWindowsでの std:: system ( "pause" ) です)、 std::system を呼び出す前に std::cout の明示的なフラッシュも必要です。他のほとんどの通常の対話型I/Oシナリオでは、 std::cout と共に使用する場合、 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> の公開メンバ関数)