136 votes

Quelle est la différence entre cout, cerr, clog de l'en-tête iostream en c++ ? Quand utiliser l'un ou l'autre ?

J'ai essayé de faire des recherches sur la différence entre cout , cerr y clog sur internet mais je n'ai pas trouvé de réponse parfaite. Je ne sais toujours pas quand utiliser lequel. Quelqu'un peut-il m'expliquer, à l'aide de programmes simples et en illustrant une situation parfaite, quand utiliser l'un ou l'autre ?

J'ai visité ce site qui montre un petit programme sur cerr y clog mais la sortie obtenue là-bas peut également être obtenue en utilisant cout . Je ne sais donc pas exactement à quoi ils servent.

6voto

Tony D Points 43962

Extrait d'un projet de document standard C++17 :

30.4.3 Objets de flux étroits [narrow.stream.objects]

istream cin;

1 L'objet cin contrôle l'entrée à partir d'un tampon de flux associé à l'objet stdin déclaré dans <cstdio> (30.11.1).

2 Après l'objet cin est initialisé, cin.tie() renvoie à &cout . Son état est par ailleurs le même que celui requis pour basic_ios<char>::init (30.5.5.2).

ostream cout;

3 L'objet cout contrôle la sortie vers un tampon de flux associé à l'objet stdout déclaré dans <cstdio> (30.11.1).

ostream cerr;

4 L'objet cerr contrôle la sortie vers un tampon de flux associé à l'objet stderr déclaré dans <cstdio> (30.11.1).

5 Après l'objet cerr est initialisé, cerr.flags() & unitbuf est non nulle et cerr.tie() renvoie à &cout . Son état est par ailleurs le même que celui requis pour basic_ios<char>::init (30.5.5.2).

ostream clog;

6 L'objet clog contrôle la sortie vers un tampon de flux associé à l'objet stderr déclaré dans <cstdio> (30.11.1).

Discussion...

cout écrit à stdout ; cerr y clog à stderr

Sortie standard ( stdout ) est destiné à recevoir les résultats du programme qui ne sont pas des erreurs ou des diagnostics, comme les résultats d'un traitement réussi qui peuvent être affichés à l'utilisateur final ou transmis à une autre étape du traitement.

Erreur standard ( stderr ) est destiné à la sortie de diagnostic, comme les messages d'avertissement et d'erreur qui indiquent que le programme n'a pas ou n'a pas pu produire la sortie à laquelle l'utilisateur peut s'attendre. 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 ultérieure.

cin y cerr sont liés à cout

Ils ont tous deux tiré la chasse cout avant de traiter les opérations d'E/S elles-mêmes. Cela garantit que les invites envoyées à cout sont visibles avant que le programme ne se bloque pour lire l'entrée à partir de cin et cette sortie antérieure à cout est vidée avant d'écrire une erreur à travers cerr qui conserve 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 écrivez à cet endroit, l'écriture ne sera pas mise en mémoire tampon et n'est pas liée à quoi que ce soit, de sorte qu'elle mettra en mémoire tampon des quantités décentes d'enregistrement avant de se vider. Cela permet d'obtenir le débit de messages le plus élevé, mais signifie que les messages peuvent ne pas être rapidement visibles pour un consommateur potentiel lisant le terminal ou l'enregistrement.

1voto

Les deux sites cout y sabot sont mis en mémoire tampon mais cerr est sans tampon et tous ces objets sont des objets prédéfinis qui sont des instances de la classe ostream. L'utilisation de base de ces trois objets est cout est utilisé pour la sortie standard alors que sabot y cerr est utilisé pour afficher les erreurs. Le point principal pourquoi cerr n'est pas bufferisé, c'est peut-être parce que si vous avez plusieurs sorties dans le buffer et qu'une exception d'erreur est mentionnée dans le code, vous devez afficher cette erreur immédiatement, ce qui peut être fait par cerr efficacement.

Veuillez me corriger si je me trompe.

1voto

Pradeep Bihani Points 36

Utilisez cerr pour les messages d'erreur. Utilisez cout pour le rendement réel.

cout est mis en mémoire tampon, cerr ne l'est pas, donc cout devrait être plus rapide dans la plupart des cas. (Bien que si vous vous souciez vraiment de la vitesse, les fonctions de sortie C telles que printf ont tendance à être beaucoup plus rapides que cout/cerr).

Si vous exécutez un programme comme celui-ci : votreprog > monfichier

Ce que vous écrivez à cout ira dans myfile. Ce que vous écrirez dans cerr ira sur mon écran. C'est généralement une bonne chose. Je ne veux probablement pas que vos messages d'erreur soient mélangés à la sortie de votre programme. (Surtout si certains de vos messages d'erreur ne sont que des avertissements ou des diagnostics). Il est également possible de rediriger cout vers un fichier, et cerr vers un autre. C'est un paradigme pratique : je lance votre programme, je redirige la sortie vers un fichier, les messages d'erreur vers un autre fichier. Si votre programme renvoie 0 à partir de main, alors je sais qu'il est possible de traiter le fichier de sortie. S'il renvoie un code d'erreur, je sais qu'il ne faut PAS traiter le fichier de sortie. Le fichier d'erreur me dira ce qui n'a pas fonctionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X