В отличие от ответа анонса (28 апреля 2009 г.) это поведение не имеет ничего общего с операционной системой или «консольным программным обеспечением».
Потоки C++ <iostream>
предназначены для взаимодействия с потоками C <stdio.h>
. Цель состоит в том, чтобы разрешить использование std::cout
с использованием printf
/puts
. Чтобы достичь этого, std::cout
streambuf
реализован на потоке stdout
C. На самом деле это C stdout
, который буферизируется по строке, когда стандартный вывод подключен к терминальному устройству.
Вы можете позвонить std::ios_base::sync_with_stdio(false)
(прежде чем ваша программа будет использовать любые стандартные потоки ввода-вывода C++), чтобы сообщить библиотеке потоков C++ напрямую связываться с файловыми дескрипторами, а не располагать поверх библиотеки потоков C. Это полностью исключает поток stdout
C и ускоряет потоки ввода-вывода C++ за счет того, что две библиотеки больше не смешиваются.
Альтернативой является безоговорочно установить stdout
для полного буферирования путем вызова std::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ)
. Затем, хотя std::cout
все еще пишет через stdout
, у вас не будет stdout
промывки после каждой новой строки.
Возможно, это может быть полезно, я сомневаюсь, что это поможет вам с вашей проблемой. http://nibuthomas.com/2009/02/12/writing-endl-like-functions-for-output-streams/ – Skurmedel
Кажется, что есть некоторые дебаты относительно легитимности утверждения о том, что C++ включает в себя C90-буферизацию строк vs полностью буферизованное различие для std :: cout. Независимо от того, есть ли способ изменить режим буферизации с помощью MSVC? – pauldoo
Возможно, вы могли бы написать тестовую программу и посмотреть, верно ли утверждение? – Skurmedel