Могу ли я остановить сброс std :: cout на "\ n"? - PullRequest
3 голосов
/ 28 апреля 2009

В соответствии с этот пост std :: cout автоматически включится на \n, когда он подключен к интерактивному устройству (например, к окну терминала). В противном случае (например, при передаче в файл) он будет работать в полной буферизации и будет сбрасываться только на .flush() или std::endl.

Есть ли способ переопределить это поведение в Microsoft Visual C ++, чтобы я мог выбрать, хочу ли я режим с полной буферизацией или с линейной буферизацией?

Ответы [ 3 ]

7 голосов
/ 31 декабря 2015

Вопреки ответу anon (28 апреля 2009 г.), это поведение не имеет ничего общего с операционной системой или «консольным программным обеспечением».

Потоки

C ++ <iostream> предназначены для взаимодействия с потоками C <stdio.h>. Цель состоит в том, чтобы разрешить использование std::cout с использованием printf / puts. Чтобы достичь этого, std::cout streambuf реализован поверх потока C stdout. Это на самом деле C stdout, который буферизуется в строке, когда стандартный вывод подключен к терминальному устройству.

Вы можете вызвать std::ios_base::sync_with_stdio(false) (до того, как ваша программа использует какой-либо из стандартных потоков ввода / вывода C ++), чтобы указать библиотеке потоков C ++ напрямую связываться с базовыми файловыми дескрипторами, а не размещать поверх библиотеки потоков C , Это полностью исключает поток C stdout и ускоряет потоки ввода-вывода C ++ за счет того, что две библиотеки перестали хорошо смешиваться.

В качестве альтернативы можно безоговорочно установить stdout на полную буферизацию путем вызова std::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ). Тогда, даже если std::cout все еще пишет через stdout, у вас не будет stdout сбрасывания после каждой новой строки.

1 голос
/ 28 апреля 2009

Это не проблема с C ++ (нет языкового требования, которое \ n сбрасывает что-либо), а с вашей операционной системой и / или консольным программным обеспечением. Если консоль хочет очистить свой буфер, когда она видит новую строку, то она может, и я думаю, что большинство это делает. Обратите внимание, что важно различать буферы среды выполнения C ++ (которые могут в некоторой степени контролироваться вашим кодом C ++) и буферы консольного приложения (над которыми оно не имеет никакого контроля).

К вашему сведению, в стандартной библиотеке iostream есть флаг с именем unitbuf , который, если установлен, приводит к сбросу буферов после каждой операции вывода. Он устанавливается, например, для потока std :: cerr. Однако это не имеет ничего общего с символом '\ n', поскольку вы можете вывести несколько символов \ n за одну операцию.

0 голосов
/ 28 апреля 2009

Реализация может свободно сбрасываться всякий раз, когда она чувствует, что это уместно. Это зависит от поставщика к поставщику, независимо от того, установлены они на \n или нет.

Я вижу что-то под названием ios_base& nounitbuf(ios_base& str); из моего черновика C ++ 0x. Дать ему шанс. Это единственное, что дает вам стандартный C ++.

...