De um documento padrão de rascunho C ++ 17:
30.4.3 Objetos de fluxo estreito [narrow.stream.objects]
istream cin;
1 O objeto cin
controla a entrada de um buffer de fluxo associado ao objeto stdin
, declarado em <cstdio>
(30.11.1).
2 Depois que o objeto cin
é inicializado, cin.tie()
retorna &cout
. Caso contrário, seu estado é o mesmo exigido para basic_ios<char>::init
(30.5.5.2).
ostream cout;
3 O objeto cout
controla a saída para um buffer de fluxo associado ao objeto stdout
, declarado em <cstdio>
(30.11.1).
ostream cerr;
4 O objeto cerr
controla a saída para um buffer de fluxo associado ao objeto stderr
, declarado em <cstdio>
(30.11.1).
5 Depois que o objeto cerr
é inicializado, cerr.flags() & unitbuf
é diferente de zero e cerr.tie()
retorna &cout
. Caso contrário, seu estado é o mesmo exigido para basic_ios<char>::init
(30.5.5.2).
ostream clog;
6 O objeto clog
controla a saída para um buffer de fluxo associado ao objeto stderr
, declarado em <cstdio>
(30.11.1).
Discussão...
cout
escreve para stdout
; cerr
e clog
parastderr
A Saída Padrão ( stdout
) destina-se a receber saída sem erro e sem diagnóstico do programa, como saída de processamento bem-sucedido que pode ser exibida para o usuário final ou transmitida para algum estágio de processamento posterior.
Erro padrão ( stderr
) destina-se a saída de diagnóstico, como mensagens de aviso e erro que indicam que o programa não produziu ou pode não ter produzido a saída que o usuário espera. Essa entrada pode ser exibida para o usuário final, mesmo se os dados de saída forem canalizados para um estágio de processamento posterior.
cin
e cerr
estão ligados acout
Ambos esvaziam cout
antes de lidar com as operações de E / S. Isso garante que os prompts enviados para cout
sejam visíveis antes dos blocos de programa para ler a entrada cin
, e que a saída anterior cout
seja liberada antes de escrever um erro cerr
, o que mantém as mensagens em ordem cronológica de sua geração quando ambos são direcionados para o mesmo terminal / arquivo / etc ..
Isso contrasta com clog
- se você escrever lá, ele não será armazenado em buffer e não estará vinculado a nada, portanto, armazenará em buffer quantidades decentes de registro antes de descarregar. Isso produz a maior taxa de transferência de mensagens, mas significa que as mensagens podem não ser rapidamente visíveis para um consumidor em potencial lendo o terminal ou seguindo o log.
stdout
,stdin
(paracin
), estderr
que ele usa por padrão. Eu acredito queclog
é apenascerr
com uma mudança de buffer.