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
появляются сразу, к ним по одной добавляются точки в течении двух секунд.