Смысл использования манипуляторов(с++) flush, unitbuf, ends

Рейтинг: 0Ответов: 1Опубликовано: 15.06.2023

По ходу изучения ввода-вывода, возник вопрос - зачем явно сбрасывать буфер, если за вас это делает программа? Что это дает? Когда и зачем стоит использовать flush, ends и т.д? В чем смысл unitbuf, когда и зачем использовать его?

Ответы

▲ 2Принят

flush использую где необходимо. Например выходной поток сбрасывает по концам строк. Для индикатора прогресса его надо сбрасывать раньше. Пример ниже.

unitbuf не использую. Вместо него flush где нужно. Причина - unitbuf влияет на поток глобально, что может изменить смысл или скорость работы других кусков программы. Чтобы этого не было, нужно сохранить текущую установку, выставить свою, вывести что надо, вернуть всё как было. Много мороки, без unitbuf проще.

ends не использую. std::cout << '\0'; проще и прямолинейнее. endl тоже не использую. Для обычного потока вывода std::cout << '\n'; работает также. Если требуется ещё гарантированно сбросить буфер, добавляю flush.

Пример с flush:

#include <chrono>
#include <iostream>
#include <thread>

int main() {

    auto wait = []{
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    };

    for (int j = 0; j < 10; ++j) {
        std::cout << "without flush ";
        for (int i = 0; i < 20; ++i) {
            wait();
            std::cout << '.';
        }
        std::cout << '\n';

        std::cout << "with flush    ";
        for (int i = 0; i < 20; ++i) {
            wait();
            std::cout << '.' << std::flush;
        }
        std::cout << '\n';
    }
}
$ g++ print.cpp 

$ ./a.out 
without flush ....................
with flush    ....................
...

Строки without flush появляются целиком через две секунды. Строки with flash появляются сразу, к ним по одной добавляются точки в течении двух секунд.