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.