Spec-Zone.ru › C++

std::flush

Определён в заголовочном файле <ostream>
template< class CharT, class Traits >
std::basic_ostream<CharT, Traits>& flush( std::basic_ostream<CharT, Traits>& os );

Сбрасывает выходную последовательность os, как если бы был вызван os.flush().

Это манипулятор ввода-вывода только для вывода; его можно вызывать с выражением, например out << std::flush, для любого out типа std::basic_ostream.

Примечания

Этот манипулятор можно использовать для немедленного вывода неполной строки, например при отображении данных от длительно выполняющегося процесса, регистрации активности нескольких потоков или регистрации активности программы, которая может неожиданно завершиться с ошибкой. Явный сброс std::cout также необходим перед вызовом std::system, если запущенный процесс выполняет операции ввода-вывода с экраном (типичный пример — std::system("pause") в Windows). В большинстве других обычных сценариев интерактивного ввода-вывода std::endl избыточен при использовании с std::cout, поскольку любой ввод из 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 ...

См. также

unitbufnounitbuf
управляет тем, сбрасывается ли вывод после каждой операции
(функция)
endl
выводит '\n' и сбрасывает выходной поток
(шаблон функции)
flush
синхронизирует данные с базовым устройством хранения
(открытая функция-член std::basic_ostream<CharT,Traits>)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/manip/flush

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API