Из проекта стандартного документа С++ 17:
30.4.3 Объекты узкого потока [narrow.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
- если вы пишете туда, он не будет буферизоваться и ни к чему не привязан, поэтому он будет буферизовать приличное количество журналов перед сбросом. Это дает самую высокую пропускную способность сообщений, но означает, что сообщения могут быть не видны быстро потенциальному потребителю, читающему терминал или следящему за журналом.
person
Tony Delroy
schedule
26.02.2018
stdout
,stdin
(дляcin
) иstderr
, который он использует по умолчанию. Я считаю, чтоclog
- это простоcerr
с изменением буферизации. - person chris   schedule 27.05.2013