web-dev-qa-db-fra.com

Que sont "cerr" et "stderr"?

Quelle est la différence entre eux et comment sont-ils utilisés? Quelqu'un peut-il me citer des exemples?

Plus précisément, comment "écrivez-vous" dans le flux dans les deux cas et comment récupérez-vous et affichez (c'est-à-dire sur l'écran) le texte qui y avait été écrit?

De plus, la sortie "écran" est elle-même un flux non? Peut-être que je ne comprends pas assez bien les streams. Cela peut également être enregistré dans un fichier, je sais. Est-ce que tous ces éléments utiliseraient fprintf/fscanf, etc.?

31
Russel

cerr est le flux C++ et stderr est le descripteur de fichier C, tous deux représentant la sortie d'erreur standard.

Vous leur écrivez de la même manière que vous écrivez dans d'autres flux et descripteurs de fichiers:

cerr << "Urk!\n";
fprintf (stderr, "Urk!\n");

Je ne suis pas sûr de ce que vous entendez par "récupérer" dans ce contexte, la sortie passe à l'erreur standard et c'est tout. Le programme n'est pas censé s'en soucier après cela. Si vous voulez savoir comment l'enregistrer pour plus tard, de l'extérieur du programme, consultez le paragraphe suivant.

Par défaut, ils iront à votre terminal mais la sortie peut être redirigée ailleurs avec quelque chose comme:

run_my_prog 2>error.out

Et, oui, la sortie "écran" est un flux (ou un descripteur de fichier) mais c'est généralement uniquement parce que stdout/cout et stderr/cerr sont connectés à votre "écran" par défaut. La redirection affectera cela comme dans le cas suivant où rien ne sera écrit sur votre écran:

run_my_prog >/dev/null 2>&1

(des choses délicates comme écrire directement dans /dev/tty nonobstant). Cet extrait redirigera à la fois la sortie standard et l'erreur standard pour accéder au compartiment de bits.

42
paxdiablo

Quelle est la différence entre eux

stderr est un FILE*, et une partie de la bibliothèque C standard. cerr est un ostream, et fait partie de la bibliothèque C++ standard.

De plus, la sortie "écran" est elle-même un flux non?

Oui, ça l'est. Mais il y a en fait deux flux qui écrivent à l'écran par défaut: stdout/cout est pour une sortie normale et stderr/cerr est pour les messages d'erreur. Ceci est utile pour la redirection: vous pouvez rediriger stdout vers un fichier mais avoir toujours vos messages d'erreur à l'écran.

7
dan04