У меня есть код, который выводит в консоль некоторый текст:
int main()
{
std::cout << "Hello, world!";
// Обеспечим некоторую задержку, не давая приложению завершиться
pause();
return 0;
}
Однако текст не выводится, пока приложение не завершится штатным образом (в данном случае при сигнале).
В чём дело?
Вы столкнулись с таким явлением, как буферизация потоков ввода-вывода.
Дело в том, что в C++ потоки std::istream
и std::ostream
(и, сответственно, их потомки) — это всего лишь обёртки над побайтовым буфером std::streambuf
. Сам же std::streambuf
содержит в себе два кэша — один для чтения, другой для записи, — в виде массивов, описываемых границами и курсором (то есть текущей позицией):
Источник: Frank B. Brokken. C++ Annotations Version 10.8.1. Chapter 14: Polymorphism
При любой работе с данными класс буфера сначала пытается сделать всё в рамках этого кэша. И только если это не является возможным (переполнился буфер записи, либо исчерпался буфер чтения), он обращается к своему дочернему классу-реализации конкретного буфера и просит либо опустошить буфер записи, либо загрузить новые данные для чтения (через вызов чисто виртуальных методов overflow()
и underflow()
соответственно).
В вашем случае очистка кэша срабатывала исключительно при уничтожении std::streambuf
, ассоциированного со стандартным потоком вывода (так как длина записанной строки была недостаточной для переполнения кэша). Соответственно, для немедленного вывода данных необходимо сбросить буфер записи вручную, вызовом метода std::ostream::flush()
. Кстати, этот метод неявно вызывается при использовании std::endl
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть кодВ функции double f(double x[], int n) делается вычисление нескольких функций с несколькими переменными
Делаю генератор мемов и хочу сделать нормальный текст а шрифт получается маленьким как его сделать большим?Я добавил spinBoX и собираюсь в нем...