Из черновика стандартного документа C ++ 17:
30.4.3 Узкие объекты потока [thin.stream.objects]
istream cin;
1 Объект cin
управляет вводом из буфера потока, связанного с объектом stdin
, объявленным в <cstdio>
(30.11.1).
2 После cin
инициализации объекта cin.tie()
возвращается &cout
. В остальном его состояние такое же, как требуется для basic_ios<char>::init
(30.5.5.2).
ostream cout;
3 Объект cout
управляет выводом в буфер потока, связанный с объектом stdout
, объявленным в <cstdio>
(30.11.1).
ostream cerr;
4 Объект cerr
управляет выводом в буфер потока, связанный с объектом stderr
, объявленным в <cstdio>
(30.11.1).
5 После cerr
инициализации объекта cerr.flags() & unitbuf
ненулевое значение и cerr.tie()
возвращается &cout
. В остальном его состояние такое же, как требуется для basic_ios<char>::init
(30.5.5.2).
ostream clog;
6 Объект clog
управляет выводом в буфер потока, связанный с объектом stderr
, объявленным в <cstdio>
(30.11.1).
Обсуждение ...
cout
пишет в stdout
; cerr
и clog
чтобыstderr
Стандартный выход ( stdout
) предназначен для получения не содержащих ошибок, недиагностических выходных данных из программы, таких как выходные данные успешной обработки, которые могут быть отображены конечному пользователю или переданы на какой-либо дальнейший этап обработки.
Стандартная ошибка ( stderr
) предназначена для диагностического вывода, такого как предупреждения и сообщения об ошибках, которые указывают на то, что программа не выдала или, возможно, не выдала вывод, который мог бы ожидать пользователь. Этот ввод может отображаться для конечного пользователя, даже если выходные данные передаются на этап дальнейшей обработки.
cin
и cerr
привязаны кcout
Оба они сбрасываются cout
перед обработкой самих операций ввода-вывода. Это гарантирует, что отправляемые приглашения cout
будут видны до того, как программа будет блокирована для чтения ввода cin
, и что предыдущий вывод cout
будет сброшен перед записью ошибки cerr
, что сохраняет сообщения в хронологическом порядке их генерации, когда оба направлены на один и тот же терминал / файл / так далее..
Это контрастирует с тем, что clog
если вы напишете там, он не будет буферизован и ни к чему не привязан, поэтому он будет буферизовать приличный объем журналов перед сбросом. Это обеспечивает наивысшую пропускную способность сообщений, но означает, что сообщения могут не быть быстро видимыми для потенциального потребителя, читающего терминал или заканчивающего журнал.
stdout
,stdin
(дляcin
),stderr
который он использует по умолчанию. Я считаю, чтоclog
это простоcerr
с изменением буферизации.