Question

Je me demandais, quel est le point de boucher?Aussi loin que je peux dire, boucher est le même que eree, mais avec mise en mémoire tampon de sorte qu'il est plus efficace.Généralement stderr est la même que la sortie standard, afin de boucher est le même que cout.Cela semble assez boiteux moi, donc je me dis que je doit être un malentendu il.Si j'ai des messages du journal d'aller au même endroit que j'ai des messages d'erreur de sortir (peut-être quelque chose dans /var/log/messages), puis je ne suis probablement pas écrit trop (donc il n'y a pas beaucoup perdu à l'aide de non-buffered eree).Dans mon expérience, je tiens mon journal de messages jusqu'à ce jour (pas de tampon), donc je peux aider à trouver un crash (donc je ne veux pas être à l'aide de la mémoire tampon de boucher).Apparemment, je devrais toujours être à l'aide de eree.

Je voudrais être en mesure de rediriger les obstruer l'intérieur de mon programme.Il serait utile de rediriger eree, de sorte que lorsque j'appelle une routine de bibliothèque, je peux contrôler où eree et de boucher aller.Certains compilateurs soutenir cela?Je viens de vérifier DJGPP et stdout est définie comme l'adresse d'un FICHIER struct, de sorte qu'il est illégal de faire quelque chose comme "stdout = freopen(...)".

  • Est-il possible de rediriger boucher, eree, cout, stdin, stdout, et/ou stderr?
  • C'est la seule différence entre le boucher et eree la mise en mémoire tampon?
  • Comment dois-je les mettre en œuvre (ou trouver) une plus robuste de la fonction de journalisation (liens s'il vous plaît)?
Était-ce utile?

La solution

Est-il possible de rediriger boucher, eree, cout, stdin, stdout, et/ou stderr?

Oui.Vous voulez que le rdbuf fonction.

ofstream ofs("logfile");
cout.rdbuf(ofs.rdbuf());
cout << "Goes to file." << endl;

C'est la seule différence entre le boucher et eree la mise en mémoire tampon?

Autant que je sache, oui.

Autres conseils

Si vous êtes dans un shell posix environnement (je suis vraiment la pensée de bash), vous pouvez rediriger tout descripteur de fichier pour tout autre descripteur de fichier, de manière à rediriger, vous pouvez:

$ myprogram 2>&5 

pour rediriger stderr vers le fichier représenté par fd=5.

Edit:à la réflexion, j'aime @Konrad Rudolph réponse sur la redirection de mieux.rdbuf() est plus cohérent et plus portable façon de le faire.

Comme pour l'enregistrement, eh bien...je commence avec la bibliothèque Boost pour toutes les choses de C++ qui n'est pas dans la bibliothèque std.Voici: Stimuler la Journalisation v2

Modifier:Stimuler la Journalisation est pas une partie de la poussée des Bibliothèques;il a été examiné, mais n'est pas acceptée.

Modifier:2 ans plus tard, en Mai 2010, de Stimuler l'a fait accepter une bibliothèque de journalisation, maintenant appelé Coup de pouce.Journal.

Bien sûr, il existe des alternatives:

  • Log4Cpp (un log4j de style de l'API C++)
  • Log4Cxx (Apache parrainé par log4j-style API)
  • Pantheios (défunte?la dernière fois que j'ai essayé, je ne pouvais pas le faire construire sur un récent compilateur)
  • Google GLog (hat tip @SuperElectric)

Il y a aussi le consignateur d'Événements de Windows.

Et un couple des articles que l'on peut utiliser:

De Base De L'Enregistreur De

#define myerr(e) {CriticalSectionLocker crit; std::cerr << e << std::endl;}

Utilisé comme myerr("ERR: " << message); ou myerr("WARN: " << message << code << etc);

Est très efficace.

Ensuite il faut faire:

./programname.exe 2> ./stderr.log
perl parsestderr.pl stderr.log

ou tout simplement analyser stderr.journal à la main

J'avoue que ce n'est pas pour extrêmement critique pour les performances du code.Mais qui écrit que, de toute façon.

Puisqu'il y a plusieurs réponses ici à propos de la redirection, je vais l'ajouter ce joli bijou Je suis tombé récemment sur la redirection:

#include <fstream>
#include <iostream>

class redirecter
{
public:
    redirecter(std::ostream & dst, std::ostream & src)
        : src(src), sbuf(src.rdbuf(dst.rdbuf())) {}
    ~redirecter() { src.rdbuf(sbuf); }
private:
    std::ostream & src;
    std::streambuf * const sbuf;
};

void hello_world()
{
    std::cout << "Hello, world!\n";
}

int main()
{
    std::ofstream log("hello-world.log");
    redirecter redirect(log, std::cout);
    hello_world();
    return 0;
}

C'est en fait une redirection de classe qui vous permet de rediriger toutes les deux cours d'eau, et de les restaurer lorsque vous avez terminé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top