Вопрос о cerr cout и clog

Кто-нибудь может объяснить разницу между cerr cout и clog и почему предлагаются разные объекты?

Я знаю, что различия следующие:

1) cout может перенаправляться, но cerr не может

2) clog может использовать буфер.

Я смущен в отношении пункта 2, я благодарен, если кто-нибудь может это уточнить.

Ответ 1

Буферизованный выход обычно намного быстрее, чем небуферизованный. Поэтому, если вы хотите быстро записать огромное количество данных в журнал (но все равно, действительно ли это на самом деле там), вы будете использовать clog, а не cerr.

И все потоки, как правило, могут быть перенаправлены, предполагая смутно компетентную операционную систему, но это соответствует стандарту С++, который не имеет понятия "перенаправление".

Ответ 2

Вывод может быть буферизированным или небуферизованным. При буферизованном выходе реализация сохраняет весь вывод, пока не станет удобно записывать его на диск (или где бы то ни было). Это хорошо и эффективно, но если программа выйдет из строя, некоторые результаты, скорее всего, будут потеряны. Реализация должна записывать небуферизованный вывод на диск по мере его возникновения, что может замедлить работу с большим количеством записей на диске, но если там не произойдет сбой программы при записи, она будет записана на диск.

Там нет реальной функциональной разницы между стандартным выходом и стандартной ошибкой; это всего лишь два разных потока вывода, которые можно перенаправить отдельно. Философия объединений Unix вместе состоит в том, что стандартный вывод будет иметь соответствующий выход для входа во вход следующего инструмента, и это в значительной степени требует наличия отдельного потока для сообщений об ошибках.

Итак, cout записывает в стандартный вывод и буферизуется. Используйте это для нормального выхода. cerr записывается в стандартный поток ошибок и не загружается. Используйте это для сообщений об ошибках. clog записывает в стандартный поток ошибок, но буферизуется. Это полезно для ведения журнала выполнения, поскольку оно не мешает стандартным выводам, но является эффективным (за счет того, что конец журнала, вероятно, будет потерян, если программа выйдет из строя).

Ответ 3

Оба могут быть перенаправлены.
В большинстве реализаций cerr не будет буферизироваться, не уверен, что это официальное требование POSIX, но безумно иметь буферный поток ошибок.

Причина наличия отдельных потоков связана с философией unix, что вывод одной программы является входом для следующего. Если "ls" идет прямо, чтобы "сортировать", проще было бы иметь ошибки на консоли, чем писать запись, чтобы понять, является ли вход сообщением об ошибке или частью текста, который вы хотите отсортировать.

Ответ 4

cout-Screen output(stdout)
clog-Buffered output of standard error(stderr)
cerr-Standard error device output (stderr)

Ответ 5

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

Рассмотрим программу, которая выводит что-то в файл журнала. И вдруг программа рухнула. Вы могли бы быть заинтересованы в этом, зная, какая ошибка привела к его краху, но если вы использовали clog (buffered) для всех журналов и ошибок, вы можете не видеть всю эту информацию, поскольку они все еще могут находиться в буфере, когда программа буфер также потерян.

Таким образом, в случае ошибок cerr в основном используется, поскольку он небуферизирован, и теперь не может быть никакой ситуации, когда основная ошибка будет потеряна во время сбоя программы только потому, что она была в буфере.