J'ai essayé des recherches sur la différence entre cout
, cerr
et clog
sur Internet , mais ne pouvait pas trouver une réponse parfaite. Je ne sais toujours pas quand utiliser lequel. Quelqu'un peut-il m'expliquer, à travers des programmes simples et illustrer une situation parfaite sur quand utiliser lequel?
J'ai visité ce site qui montre un petit programme sur cerr
et clog
, mais la sortie obtenue là-bas peut également être obtenue en utilisant cout
. Donc, je suis confus sur l'utilisation exacte de chacun.
stdout
,stdin
(pourcin
), etstderr
qu'il utilise par défaut. Je crois queclog
c'est justecerr
avec un changement de tampon.Réponses:
stdout
etstderr
sont des flux différents, même s'ils font tous deux référence à la sortie de la console par défaut. Rediriger (canaliser) l'un d'entre eux (par exempleprogram.exe >out.txt
) n'affecterait pas l'autre.Généralement,
stdout
doit être utilisé pour la sortie réelle du programme, tandis que toutes les informations et tous les messages d'erreur doivent être imprimésstderr
, de sorte que si l'utilisateur redirige la sortie vers un fichier, les messages d'information sont toujours imprimés à l'écran et non vers le fichier de sortie.la source
Généralement, vous l'utilisez
std::cout
pour la sortie normale,std::cerr
pour les erreurs etstd::clog
pour la "journalisation" (ce qui peut signifier ce que vous voulez que cela signifie).La principale différence est qu'elle
std::cerr
n'est pas tamponnée comme les deux autres.Par rapport à l'ancien C
stdout
etstderr
,std::cout
correspond àstdout
, tandis questd::cerr
et lesstd::clog
deux correspondent àstderr
(sauf questd::clog
c'est tamponné).la source
clog
sorties verscerr
. Alors, sur cette base, lequel choisissez-vous? Siclog
c'est normalement pour la "journalisation", pourquoi voudrais-je que cela aille dans le flux d'erreur? Les journaux ressemblent plus à des "journaux normaux" (akacout
) qu'à des erreurs.cerr
etclog
utilise la sortie standard "error", maisclog
est mis en mémoire tampon, ce qui pourrait expliquer pourquoi cela ressemble plus àcout
. Lequel choisir pour la sortie d'erreur? Cela dépend, je suppose, de plus de raisons que je ne peux énumérer et cela doit être décidé au cas par cas.Flux de sortie standard (cout):
cout
est l'instance de laostream
classe.cout
est utilisé pour produire une sortie sur le périphérique de sortie standard qui est généralement l'écran d'affichage. Les données devant être affichées à l'écran sont insérées dans le flux de sortie standard (cout
) à l'aide de l'opérateur d'insertion (<<
).Flux d'erreurs standard non tamponné (cerr):
cerr
est le flux d'erreurs standard qui est utilisé pour générer les erreurs. Ceci est également une instance de laostream
classe. Tel qu'ilcerr
n'est pas mis en mémoire tampon , il est utilisé lorsque nous devons afficher le message d'erreur immédiatement. Il n'a pas de tampon pour stocker le message d'erreur et l'afficher plus tard.Flux d'erreur standard tamponné (sabotage): Il s'agit également d'une instance de
ostream
classe et utilisé pour afficher les erreurs, mais contrairement àcerr
l'erreur, elle est d'abord insérée dans un tampon et stockée dans la mémoire tampon jusqu'à ce qu'elle ne soit pas complètement remplie.Lectures supplémentaires: basic-input-output-c
la source
La différence de ces 3 flux est la mise en mémoire tampon.
Veuillez vérifier le code suivant et exécutez DEBUG sur 3 lignes: f (std :: clog), f (std :: cerr), f (std :: out), puis ouvrez 3 fichiers de sortie pour voir ce qui s'est passé. Vous pouvez échanger ces 3 lignes pour voir ce qui va se passer.
la source
la source
À partir d'un projet de document standard C ++ 17:
Discussion...
cout
écrit àstdout
;cerr
etclog
àstderr
Sortie standard (
stdout
) est destiné à recevoir une sortie sans erreur et sans diagnostic du programme, telle que la sortie d'un traitement réussi qui peut être affichée à l'utilisateur final ou diffusée dans une étape de traitement supplémentaire.Erreur standard (
stderr
) est destinée à la sortie de diagnostic, comme les messages d'avertissement et d'erreur indiquant que le programme n'a pas ou n'a peut-être pas produit la sortie attendue par l'utilisateur. Cette entrée peut être affichée à l'utilisateur final même si les données de sortie sont acheminées vers une étape de traitement supplémentaire.cin
etcerr
sont liés àcout
Ils sont tous deux vidés
cout
avant de gérer eux-mêmes les opérations d'E / S. Cela garantit que les invites envoyées àcout
sont visibles avant que le programme ne bloque l'entrée à partir decin
, et que la sortie précédente verscout
est vidée avant d'écrire une erreur viacerr
desquels , ce qui maintient les messages dans l'ordre chronologique de leur génération lorsque les deux sont dirigés vers le même terminal / fichier / etc..Cela contraste avec
clog
- si vous y écrivez, il ne sera pas mis en mémoire tampon et n'est lié à rien, il mettra donc en mémoire tampon des quantités de journalisation de taille décente avant le vidage. Cela donne le débit de messages le plus élevé, mais signifie que les messages peuvent ne pas être rapidement visibles pour un consommateur potentiel qui lit le terminal ou qui suit le journal.la source
Les deux Cout et saboterie sont mises en mémoire tampon , mais cerr est un tampon et tous ces éléments sont des objets prédéfinis qui sont des instances de ostream de classe. L'utilisation de base de ces trois éléments est que cout est utilisé pour l'entrée standard tandis que sabot et cerr sont utilisés pour afficher les erreurs. Le point principal pour lequel cerr n'est pas tamponné est peut-être parce que supposons que vous ayez plusieurs sorties dans le tampon et qu'une exception d'erreur soit mentionnée dans le code, vous devez alors afficher cette erreur immédiatement, ce qui peut être fait par cerr efficacement.
S'il vous plait corrigez moi si je me trompe.
la source