2011-05-06 17 views
9

Estoy escribiendo una pequeña aplicación de C++ para ajustar la función de entrenamiento de OpenCV Haar (es decir, cvCreateTreeCascadeClassifier). La función arroja una carga completa de salida a la consola y deseo analizar esta salida para que pueda poblar varias variables en mi código.¿Cómo redirigir la salida de impresión de vuelta al código?

La función que deseo utilizar no es parte de la biblioteca de openCV real; en su lugar, tiene que construirse con mi código como parte del proyecto. Toda la salida de la función es a través de printf.

Pregunta: ¿Es posible interceptar las instrucciones printf antes de que terminen en la consola? He logrado redirigirlos usando freopen, pero parece un poco torpe ya que necesito analizar el archivo y luego eliminarlo cuando la llamada a la función finaliza. Además, es probable que la función se ejecute durante varias horas (¡y posiblemente incluso semanas!) Por lo que el tamaño del archivo podría ser un problema si también se adjunta constantemente.

Requisitos: Necesito que esta aplicación sea C++ y que se ejecute tanto en Windows como en Linux (pero no tiene problemas con las declaraciones de compilación condicionales si es necesario). También me gustaría poder seguir viendo mis mensajes de cout y cerr en la consola (solo que no en printf).

¡Mi Google ha eliminado mi voluntad de vivir! ¿Alguien puede ayudarme con una solución a través de ejemplos de código o punteros a lugares donde debería buscar una respuesta?

Gracias

Respuesta

7

Lo que puede hacer es:

  • crear una tubería
  • hacen al final se puede escribir de la tubería de la nueva salida estándar
  • leer desde la parte legible del tubo

lectura y la escritura debe ocurrir en diferentes hilos o se arriesga a que su programa se muera de hambre en un extremo de la tubería.

He aquí una muestra de cómo hacer el cambio de dirección en UNIX & ventanas:


#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; 
} 

Este código debe imprimir

buf=>Hi there 

(estoy usando afirmar aquí, porque Soy demasiado perezoso para hacer una comprobación de error real para este ejemplo)

+0

Excelente, esto es justo lo que necesitaba. Había leído mucho sobre todas estas funciones, etc. pero la mayoría de los ejemplos se presentaron de una manera demasiado complicada que los hizo un poco difíciles de entender. Tu ejemplo fue perfecto, breve y también el punto. ¡Gracias! – john

0

encapsular el lib en una aplicación, y el tubo de salida de la aplicación para su aplicación. Ahora escriba una secuencia de comandos para que no tenga que ejecutar las aplicaciones juntas todas las veces con una tubería.

Cuestiones relacionadas