Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

std::cout не выводит данные в консоль

#cpp #потоки_данных


У меня есть код, который выводит в консоль некоторый текст:

int main()
{
    std::cout << "Hello, world!";

    // Обеспечим некоторую задержку, не давая приложению завершиться
    pause();

    return 0;
}


Однако текст не выводится, пока приложение не завершится штатным образом (в данном
случае при сигнале).

В чём дело?
    


Ответы

Ответ 1



Вы столкнулись с таким явлением, как буферизация потоков ввода-вывода. Дело в том, что в 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.

Комментариев нет:

Отправить комментарий