Eu tentei pesquisar a diferença entre cout
, cerr
e clog
na internet, mas não conseguiu encontrar uma resposta perfeita. Ainda não tenho certeza de quando usar qual. Alguém pode me explicar, através de programas simples e ilustrar uma situação perfeita de quando usar qual?
Visitei este site que mostra um pequeno programa no cerr
e clog
, mas o output obtido ali também pode ser obtido usando cout
. Então, estou confuso sobre o uso exato de cada um.
stdout
,stdin
(paracin
), estderr
que ele usa por padrão. Eu acredito queclog
é apenascerr
com uma mudança de buffer.Respostas:
stdout
estderr
são fluxos diferentes, embora ambos se refiram à saída do console por padrão. Redirecionar (tubulação) um deles (por exemploprogram.exe >out.txt
) não afetaria o outro.Geralmente,
stdout
deve ser usado para a saída real do programa, enquanto todas as informações e mensagens de erro devem ser impressasstderr
, de modo que, se o usuário redirecionar a saída para um arquivo, as mensagens de informação ainda sejam impressas na tela e não no arquivo de saída.fonte
Geralmente você usa
std::cout
para saída normal,std::cerr
para erros estd::clog
para "registro" (o que pode significar o que você quiser).A principal diferença é que
std::cerr
não é armazenado em buffer como os outros dois.Em relação ao antigo C
stdout
estderr
,std::cout
corresponde astdout
, enquantostd::cerr
estd::clog
ambos correspondem astderr
(exceto questd::clog
é armazenado em buffer).fonte
clog
também dá saída paracerr
. Então, com base nisso, qual você escolhe? Seclog
for normalmente para "registro", por que eu iria querer que isso fosse para o fluxo de erro? Os logs parecem mais "logs normais" (também conhecidos comocout
) do que erros.cerr
eclog
usa a saída de "erro" padrão, masclog
é armazenado em buffer, o que pode ser o motivo pelo qual parececout
. Qual escolher para a saída de erro? Depende, eu acho, de mais razões do que eu posso listar e tem que ser decidido caso a caso.Fluxo de saída padrão (cout):
cout
é a instância daostream
classe.cout
é usado para produzir saída no dispositivo de saída padrão, que geralmente é a tela de exibição. Os dados que precisam ser exibidos na tela são inseridos no fluxo de saída padrão (cout
) usando o operador de inserção (<<
).Fluxo de erro padrão sem buffer (cerr):
cerr
é o fluxo de erro padrão usado para gerar os erros. Esta também é uma instância daostream
classe. Como nãocerr
está armazenado em buffer , é usado quando precisamos exibir a mensagem de erro imediatamente. Ele não tem nenhum buffer para armazenar a mensagem de erro e exibi-la posteriormente.Fluxo de erro padrão com buffer (entupir): Esta também é uma instância da
ostream
classe e usada para exibir erros, mas ao contráriocerr
do erro é primeiro inserido em um buffer e armazenado no buffer até que não seja totalmente preenchido.leitura adicional: basic-input-output-c
fonte
A diferença entre esses três fluxos é o buffer.
Verifique o código a seguir e execute DEBUG em 3 linhas: f (std :: clog), f (std :: cerr), f (std :: out) e, em seguida, abra 3 arquivos de saída para ver o que aconteceu. Você pode trocar essas 3 linhas para ver o que acontecerá.
fonte
fonte
De um documento padrão de rascunho C ++ 17:
Discussão...
cout
escreve parastdout
;cerr
eclog
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
ecerr
estão ligados acout
Ambos esvaziam
cout
antes de lidar com as operações de E / S. Isso garante que os prompts enviados paracout
sejam visíveis antes dos blocos de programa para ler a entradacin
, e que a saída anteriorcout
seja liberada antes de escrever um errocerr
, 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.fonte
Ambos cout e clog são armazenados em buffer, mas cerr não é armazenado em buffer e todos esses são objetos predefinidos que são instâncias da classe ostream. O uso básico desses três é cout é usado para entrada padrão, enquanto clog e cerr são usados para mostrar erros. O ponto principal porque o cerr não está armazenado em buffer pode ser porque suponha que você tenha várias saídas no buffer e uma exceção de erro seja mencionada no código então você precisa mostrar esse erro imediatamente o que pode ser feito por cerr eficaz.
Por favor corrija-me se eu estiver errado.
fonte
cout é geralmente usado para exibir algumas instruções na tela do usuário. ex-: cout << "Arlene Batada";
resultado:
Arlene Batada
fonte