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 действителен только в том случае, если требуется возврат. Не знаете, как это сделать, если вы хотите сбросить приглашение командной строки.