2011-05-06 2 views
9

J'écris une petite application C++ pour envelopper la fonction d'entraînement d'haven opencv (à savoir cvCreateTreeCascadeClassifier). La fonction jette toute une charge de sortie sur la console et je souhaite analyser cette sortie pour pouvoir remplir différentes variables dans mon code.Comment rediriger la sortie printf en code?

La fonction que je souhaite utiliser ne fait pas partie de la bibliothèque openCV actuelle; il doit plutôt être construit avec mon code dans le cadre du projet. Toute la sortie de la fonction est via printf. Question: Est-il possible d'intercepter les instructions printf avant qu'elles ne finissent sur la console? J'ai réussi à les rediriger en utilisant freopen mais cela semble un peu maladroit car j'ai alors besoin d'analyser le fichier puis de le supprimer quand l'appel de fonction est terminé. En outre, la fonction est susceptible d'être en cours d'exécution pendant plusieurs heures (et peut-être même des semaines!), De sorte que la taille du fichier peut être un problème si elle est constamment en cours d'ajout. Exigences: J'ai besoin de cette application pour être C++ et pour fonctionner sur Windows et Linux (mais ne pas avoir de problème avec les instructions de compilation conditionnelles si nécessaire). J'aimerais aussi pouvoir voir mes messages cout et cerr sur la console (mais pas le printf).

Mon googling a enlevé ma volonté de vivre! Quelqu'un peut-il aider avec une solution via un exemple de code ou des pointeurs vers des endroits que je devrais chercher une réponse?

Merci

Répondre

7

Qu'est-ce que vous pouvez faire est:

  • créer un tuyau
  • faire la fin inscriptible du tuyau nouveau stdout
  • lecture de la partie lisible du tube

lecture et l'écriture devrait se produire dans différents threads ou vous risquez que votre programme affame sur une extrémité du tuyau.

Voici un exemple de comment faire la redirection dans les fenêtres unix &:


#include <fcntl.h> 
#include <stdlib.h> 
#include <stdio.h> 
/* gcc defined unix */ 
#ifdef unix 
#include <unistd.h> 
#endif 
#ifdef WIN32 
#include <io.h> 
#define pipe(X) _pipe(X,4096,O_BINARY)  
#define fileno _fileno 
#define dup2 _dup2 
#define read _read 

#endif 
#include <assert.h> 

int main() 
{ 
    int fds[2]; 
    int res; 
    char buf[256]; 
    int so; 

    res=pipe(fds); 
    assert(res==0); 

    so=fileno(stdout); 
    // close stdout handle and make the writable part of fds the new stdout. 
    res=dup2(fds[1],so); 
    assert(res!=-1); 

    printf("Hi there\n"); 
    fflush(stdout); 
    // reading should happen in a different thread 

    res=read(fds[0],buf,sizeof(buf)-1); 
    assert(res>=0 && res<sizeof(buf)); 
    buf[res]=0; 
    fprintf(stderr,"buf=>%s\n",buf); 
    return 0; 
} 

Ce code devrait imprimer

buf=>Hi there 

(J'utilise affirmer ici, parce que Je suis trop paresseux pour faire une vraie erreur de vérification pour cet exemple)

+0

Excellent - c'est exactement ce dont j'avais besoin. J'avais beaucoup lu sur toutes ces fonctions, mais la plupart des exemples étaient présentés de manière trop compliquée, ce qui les rendait un peu difficiles à comprendre. Votre exemple était parfait, court et aussi le point.Merci! – john

0

encapsulent le lib dans une application, et le tuyau de sortie de l'application à votre application. Maintenant, écrivez un script de sorte que vous n'ayez pas à exécuter les applications ensemble à chaque fois avec un tuyau.

Questions connexes