2010-07-08 4 views
25

Quelle est la différence entre eux et comment sont-ils utilisés? Quelqu'un peut-il me diriger vers des exemples? Plus précisément, comment écrire dans le flux dans les deux cas et comment récupérer et afficher (c'est-à-dire à l'écran) le texte qui y a été écrit?Qu'est-ce que "cerr" et "stderr"?

En outre, la sortie "écran" est elle-même un flux droit? Peut-être que je ne comprends pas assez les cours d'eau. Cela peut également être enregistré dans un fichier bien sûr, je sais. Est-ce que tous utiliseraient fprintf/fscanf, etc?

+8

Pas besoin de s'excuser pour avoir posé une question débutante. SO est destiné à tous les niveaux de compétences. – paxdiablo

Répondre

32

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

Vous écrivez à eux la même façon que vous écrivez à 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 préoccuper après cela. Si vous voulez dire comment l'enregistrer pour plus tard, de l'extérieur du programme, voir le paragraphe suivant.

Par défaut, ils vont à 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 descripteur de fichier), mais C'est généralement seulement parce que stdout/cout et stderr/cerr sont connectés à votre "écran" par défaut. Redirection affectera cela comme dans le cas suivant où rien ne sera écrit à l'écran:

run_my_prog >/dev/null 2>&1 

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

+2

L'autre différence est que l'erreur standard n'est pas mise en mémoire tampon (c'est-à-dire auto-flush sur chaque écriture) ou linéaire (auto-flush sur chaque \ n), qu'elle fasse ou non référence à un dispositif interactif. En revanche, la sortie standard est entièrement mise en mémoire tampon si (et seulement si) elle ne fait pas référence à un périphérique interactif. –

+2

Eh bien, techniquement, c'est une différence entre stdout et stderr (ou cout et cerr), pas cerr et stderr :-) – paxdiablo

6

Quelle est la différence entre les

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

En outre, la sortie "écran" est elle-même un flux droite?

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

+0

Est-il possible d'obtenir le pointeur 'FILE * stderr' de l'objet' std :: ostream cerr'? (quelque chose comme 'cerr.rdbuf() -> bla') – alfC

+0

@alfC: Il n'y a pas de façon standard de le faire. Voir http://stackoverflow.com/questions/109449/getting-a-file-from-a-stdfstream. – dan04

+0

oui, j'ai répondu là http://stackoverflow.com/a/19749019/225186. Je pense que la réponse la plus élégante est celle-ci: http://stackoverflow.com/a/33612982/225186 – alfC