Почему выходной буфер по-прежнему очищается немедленно, а не ждет 10 секунд, пока он отобразится?

В соответствии с использованием объекта cout содержимое сначала будет сохраняться в выходном буфере до тех пор, пока не наступит условие триггера или пока программа не завершится.

Затем выходной буфер очищается.

Наконец, терминал отображает содержимое.

Но оно отображается сразу.

#include <iostream>
#include <windows.h>

int main() {
    std::cout << "Hello, World!";
    Sleep(10000);
    return 0;
}

Как отразить эффект буфера метода cout в выходном потоке?
Или это касается операционной системы?

На самом деле вы не контролируете, когда вывод сбрасывается. Это зависит от вашего терминала. Вы можете в какой-то степени повлиять на буферизацию, но действительно ли это проблема?

paddy 04.04.2024 05:14

Это зависит от реализации. Попробуйте построить его с помощью Release.

김선달 04.04.2024 06:49
cout — это не функция или метод, это объект.
molbdnilo 04.04.2024 08:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В общем, std::cout не буферизуется по умолчанию: пока активен sync_with_stdio, каждый байт, записанный в буфер std::cout, немедленно помещается в буфер stdout.

По умолчанию стандартный вывод в POSIX буферизуется по строкам, поэтому, если вы запустите указанную выше программу с помощью gcc в Linux (со спящим режимом C++ вместо спящего режима Windows), вы не увидите вывод до тех пор, пока не пройдет пауза.

На основе «Sleep(5000);» однако это использует Windows. Там потоки ввода-вывода C не буферизуются. Вы можете это заметить, заменив std::cout << "test"; с printf("тест");. Вывод по-прежнему появляется немедленно.

Вы все равно можете заставить Windows задерживать вывод, если включите буферизацию на стандартном выводе:

#include <iostream>
#include <cstdio>
#include <windows.h>

int main()
{
    char buf[BUFSIZ];
    std::setbuf(stdout, buf);
    std::cout << "test";
    // std::fflush(stdout); // <- uncomment to see the text before the pause
    Sleep(5000);
    std::fflush(stdout);
    std::setbuf(stdout, NULL); // don't let the stream outlive the buffer
}

Однако эта демонстрация не позволит вам наблюдать эффект std::flush, поскольку флеш только перемещает буфер cout (которого у него даже нет по умолчанию) в буфер stdout, где выходные данные находятся до тех пор, пока не будут сброшены с помощью std::fflush или неявные средства.

Чтобы наблюдать за std::flush, дайте std::cout собственный буфер и отключите его от потоков ввода-вывода C:

#include <iostream>
#include <windows.h>

int main()
{
    char buf[BUFSIZ];
    std::ios::sync_with_stdio(false);
    std::cout.rdbuf()->pubsetbuf(buf, sizeof buf);
    std::cout << "test";
    //std::cout << std::flush; // <- uncomment to obseve the output before the pause
    Sleep(5000);
    std::cout << std::flush;
    std::cout.rdbuf()->pubsetbuf(nullptr, 0); // don't let the stream outlive the buffer
}

Другие вопросы по теме