37 votes

Comment puis-je rediriger stdout vers un affichage visible dans une application Windows?

J'ai accès à une bibliothèque tierce qui n'a de "bonnes choses". Il émet l'état et l'évolution des messages sur la sortie standard stdout. Dans une application de Console je vois ces messages de l'amende juste. Dans une application Windows, ils ont juste aller le seau bits.

Est-il une manière assez simple de redirection de stdout et stderr vers un contrôle de texte ou d'un autre endroit visible. Idéalement, cela n'aurait besoin d'aucune recompilation du code tiers. Il serait juste d'intercepter les vapeurs à un faible niveau. J'aimerais une solution où je viens de #inclure l'en-tête, appeler la fonction d'initialisation et de lier la bibliothèque comme dans...

#include "redirectStdFiles.h"

void function(args...)
{
  TextControl* text = new TextControl(args...);
  initializeRedirectLibrary(text, ...);

  printf("Message that will show up in the TextControl\n");
  std::cout << "Another message that also shows up in TextControl\n";
}

Il serait encore mieux si elle utilisait une interface que j'ai pu la remplacer si elle n'est pas liée à un quelconque bibliothèque d'interface graphique.

class StdFilesRedirector
{
  public:
    writeStdout(std::string const& message) = 0;
    writeStderr(std::string const& errorMessage) = 0;
    readStdin(std::string &putReadStringHere) = 0;
};

Suis-je en train de rêver? Ou quelqu'un sait-il quelque chose qui peut faire quelque chose de ce genre?

Edit après deux réponses: je pense que l'utilisation d'freopen pour rediriger les fichiers est une bonne première étape. Pour une solution complète, il faudrait un nouveau fil de discussion créé pour lire le fichier et afficher le résultat. Pour le débogage, faire un "tail-f" dans une fenêtre shell cygwin serait suffisant. Pour une plus poli de l'application... Qui est ce que je veux écrire... il y aura un peu de travail supplémentaire à la création du thread, etc.

18voto

n0rd Points 2889

Vous devez créer un tuyau (avec CreatePipe () ), puis attacher stdout à son extrémité d'écriture avec SetStdHandle () , vous pourrez alors lire à partir de la fin de lecture du tuyau avec ReadFile () et mettre le texte que vous obtiendrez n'importe où.

16voto

Brian R. Bondy Points 141769

Vous pouvez rediriger stdout, stderr et stdin avec freopen .

À partir du lien ci-dessus:

 /* freopen example: redirecting stdout */
#include <stdio.h>

int main ()
{
  freopen ("myfile.txt","w",stdout);
  printf ("This sentence is redirected to a file.");
  fclose (stdout);
  return 0;
}
 

Vous pouvez également exécuter votre programme via une invite de commande comme suit:

 a.exe > stdout.txt 2> stderr.txt
 

5voto

shoosh Points 34322

Lorsque vous créez un processus à l'aide de la fonction CreateProcess() vous pouvez choisir un HANDLE qui stdout et stderr sont va être écrit. Cette HANDLE peut être un fichier pour lequel vous indiquer la sortie.

Cela vous permettra d'utiliser le code sans le recompiler. Juste l'exécuter et au lieu d'utiliser system() ou que sais-je encore, utilisez CreateProcess().

La POIGNÉE vous donner d' CreateProcess() peut également être celle d'un tuyau que vous avez créé, et puis vous pouvez lire à partir de la pipe et de faire autre chose avec les données.

3voto

greyfade Points 14358

Vous pouvez faire quelque chose comme ça avec cout ou cerr:

 // open a file stream
ofstream out("filename");
// save cout's stream buffer
streambuf *sb = cout.rdbuf();
// point cout's stream buffer to that of the open file
cout.rdbuf(out.rdbuf());
// now you can print to file by writing to cout
cout << "Hello, world!";
// restore cout's buffer back
cout.rdbuf(sb);
 

Ou, vous pouvez le faire avec un std::stringstream ou une autre classe dérivée de std::ostream .

Pour rediriger stdout, vous devez rouvrir le descripteur de fichier. Ce fil a quelques idées de cette nature.

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