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.

158voto

Joachim Pileborg Points 121221

En général, vous utilisez std::cout pour une sortie normale, std::cerr pour les erreurs, et std::clog pour "journalisation" (qui peut signifier ce que vous voulez).

La différence majeure est que std::cerr n'est pas mis en mémoire tampon comme les deux autres.


Par rapport à l'ancien C stdout y stderr , std::cout correspond à stdout alors que std::cerr y std::clog correspond à la fois stderr (sauf que std::clog est mis en mémoire tampon).

73voto

riv Points 1264

stdout y stderr sont des flux différents, même s'ils font tous deux référence à la sortie console par défaut. La redirection (piping) de l'un d'entre eux (par ex. program.exe >out.txt ) n'affecterait pas l'autre.

En général, stdout doit être utilisé pour la sortie effective du programme, tandis que toutes les informations et tous les messages d'erreur doivent être imprimés dans le fichier stderr de sorte que si l'utilisateur redirige la sortie vers un fichier, les messages d'information sont toujours imprimés à l'écran et non dans le fichier de sortie.

28voto

roottraveller Points 4532

Flux de sortie standard (cout) : cout est l'instance de la ostream 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 nécessaires à l'affichage sur l'écran sont insérées dans le flux de sortie standard ( cout ) en utilisant l'opérateur d'insertion ( << ).

Flux d'erreur standard sans tampon (cerr) : cerr est le flux d'erreur standard qui est utilisé pour sortir les erreurs. Il s'agit également d'une instance de la classe ostream classe. Comme cerr es sans tampon il est donc 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é (clog) : Il s'agit également d'une instance de ostream et utilisée pour afficher les erreurs, mais contrairement à la classe cerr l'erreur est d'abord insérée dans un tampon et est stocké dans le tampon jusqu'à ce qu'il ne soit pas entièrement rempli.

Pour en savoir plus : entrée-sortie de base-c

13voto

David Vargas Points 145
  • Utilisez cout pour la sortie standard.
  • Utilisez cerr pour montrer les erreurs.
  • Utilisez sabot pour la journalisation.

12voto

Duc-Viet Ha Points 121

La différence de ces 3 flux est la mise en mémoire tampon.

  1. Avec cerr, la sortie clignote
    • immédiatement (car cerr n'utilise pas de tampon).
  2. En cas d'engorgement, la sortie coule
    • après avoir terminé votre fonction actuelle.
    • appeler explicitement la fonction flush.
  3. Avec cout, la sortie clignote
    • après avoir appelé les flux de sortie (cout, cerr, clog).
    • après avoir terminé votre fonction actuelle.
    • appeler explicitement la fonction flush.

Vérifiez le code suivant, et exécutez DEBUG à travers 3 lignes : f(std::clog), f(std::cerr), f(std::out), puis ouvrez 3 fichiers de sortie pour voir ce qui se passe. Vous pouvez intervertir ces 3 lignes pour voir ce qui se passe.

#include <iostream>
#include <fstream>
#include <string>

void f(std::ostream &os)
{
    std::cin.clear(); // clear EOF flags
    std::cin.seekg(0, std::cin.beg); // seek to begin

    std::string line;
    while(std::getline(std::cin, line))   //input from the file in.txt
        os << line << "\n";   //output to the file out.txt
}

void test()
{
    std::ifstream in("in.txt");
    std::ofstream out("out.txt"), err("err.txt"), log("log.txt");
    std::streambuf *cinbuf = std::cin.rdbuf(), *coutbuf = std::cout.rdbuf(), *cerrbuf = std::cerr.rdbuf(),
                    *clogbuf = std::clog.rdbuf();

    std::cin.rdbuf(in.rdbuf()); //redirect std::cin to in.txt!
    std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
    std::cerr.rdbuf(err.rdbuf());
    std::clog.rdbuf(log.rdbuf());

    f(std::clog);
    f(std::cerr);
    f(std::cout);

    std::cin.rdbuf(cinbuf);
    std::cout.rdbuf(coutbuf);
    std::cerr.rdbuf(cerrbuf);
    std::clog.rdbuf(clogbuf);
}

int main()
{
    test();
    std::cout << "123";
}

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