З проекту стандартного документа C ++ 17:
30.4.3 Вузькі об'єкти потоку [Вузькі.потоки.об'єкти]
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
зміна буферизації.