стандартный вывод и нужно его смывать - PullRequest
18 голосов
/ 02 июня 2011

У меня есть некоторый код C ++, который использует операторы cout для целей отладки, и по какой-то причине я не могу получить все данные для печати, пока не наберу std::cout.flush(); в конце.

Я не совсем понимаю, зачем нужна эта операция сброса.

У кого-нибудь есть понимание?

Ответы [ 7 ]

11 голосов
/ 02 июня 2011

Чтобы добавить к другим ответам: вместо этого ваши операторы отладки должны перейти на cerr, потому что:

  • записывает стандартную ошибку, что означает, что при запуске приложения вы можете легкоотделить «нормальный» вывод программы от информации об ошибках / отладке с помощью перенаправления;
  • самое главное, cerr по умолчанию равно небуферизовано , что означает, что послекаждая выходная операция автоматически сбрасывается, и в целом это желательно для ошибок и отладочных выходных данных.

(источник: стандарт C ++, §27.3.1 -54-5, §27.4.2.1.2 таблица 83)

9 голосов
/ 02 июня 2011

Используете ли вы std::endl для завершения своих линий.Это должно быть обычной практикой, пока проблемы производительности не требуют иного, но по какой-то причине я вижу много кода, в котором вместо этого используется '\n'.

В противном случае вы всегда можете сделать:

std::cout.setf( std::ios_base::unitbuf );

как одна из первых вещей в main.Это приведет к сбросу в конце каждого <<, что больше, чем нужно, но для диагностического вывода на консоль, вероятно, вполне приемлемо.

4 голосов
/ 02 июня 2011

Не имеют ли данные, которые автоматически сбрасываются, \n в конце?По умолчанию стандартный выход не доставляется до тех пор, пока не будет замечен возврат каретки.

1 голос
/ 02 июня 2011

"Когда вы отправляете выходные данные в поток, они не обязательно распечатываются немедленно. Скорее, они могут ждать в буфере до некоторого неопределенного события, например, до заполнения буфера, чтения из ввода или выхода из программы. изменяться. "

http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html

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

Ответ std::endl действителен только в том случае, если вы хотите получить возврат.Не уверен, как бы вы это сделали, если хотите сбросить командную строку.

0 голосов
/ 02 июня 2011

В C ++ вы можете использовать endl форматер с оператором cout вместо flush.

0 голосов
/ 02 июня 2011

Это правильное поведение.Вы, вероятно, используете std::endl, который добавляет \n и очищает буфер.http://www.cplusplus.com/reference/ostream/endl/

Вам необходимо очистить поток, если вы хотите увидеть вывод.

...