Stdout и нужно очистить его С++
У меня есть код на С++, который использует инструкции cout
для целей отладки, и по какой-то причине я не могу получить все данные для печати, если я не сделаю std::cout.flush();
в конце.
Я не совсем понимаю, зачем нужна эта операция очистки.
У кого-нибудь есть понимание?
Ответы
Ответ 1
Чтобы добавить к другим ответам: вместо инструкций отладки следует перейти к cerr
, потому что:
- он записывает стандартную ошибку, а это означает, что при запуске приложения вы можете легко отделить "нормальную" программу от информации об ошибках/отладочной информации путем перенаправления;
- Самое главное,
cerr
по умолчанию - небуферизованный, что означает, что после каждой операции вывода он автоматически сбрасывается сам, и в целом это желательно для ошибок и вывода отладки.
(источник: стандарт С++, §27.3.1 ¶4-5, §27.4.2.1.2, таблица 83)
Ответ 2
Используете ли вы std::endl
для завершения ваших строк. Это должно быть
обычной практики, пока проблемы с производительностью не потребуют иного, но для некоторых
Причина, я вижу много кода, который использует '\n'
вместо этого.
В противном случае вы всегда можете:
std::cout.setf( std::ios_base::unitbuf );
как одна из первых вещей в main
. Это приведет к
конца каждого <<
, что больше, чем вам нужно, но для диагностики
вывода на консоль, вероятно, вполне приемлемо.
Ответ 3
Являются ли данные, которые автоматически не сбрасываются при отсутствии \n
в конце? По умолчанию стандартный выход не доставляется до тех пор, пока не увидит возврат каретки.
Ответ 4
"Когда вы отправляете вывод в поток, он не обязательно печатается немедленно. Скорее, он может ждать в буфере до некоторого неопределенного события, например, достаточно буфера, чтения с ввода или выхода из программы. изменяются".
http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html
Ответ 5
Это правильное поведение. Вероятно, вы используете std::endl
, которые добавляют \n
и очищают буфер. http://www.cplusplus.com/reference/ostream/endl/
Вам нужно очистить поток, если вы хотите увидеть результат.
Ответ 6
В С++ вы можете использовать форматер endl
с оператором cout
, а не flush
.
Ответ 7
Ответ std::endl
действителен только в том случае, если требуется возврат.
Не знаете, как это сделать, если вы хотите сбросить приглашение командной строки.