tuberias significa salidas salida redirigir redireccionar redireccionamiento que guardar fichero ejemplos comando canal archivo c++ redirect console opencv printf

c++ - significa - ¿Cómo redirigir la salida de impresión de vuelta al código?



redirigir salida comando linux a fichero (3)

Eche un vistazo a: http://www.unix.com/programming/136225-reading-stdout-pipe.html parece prometedor, pero nunca lo intenté.

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.

La función que deseo usar 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


Encapsule la lib en una aplicación y canalice la salida de la aplicación a 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.


Lo que puedes hacer es:

  • crear una tubería
  • hacer que el extremo escribible de la tubería sea el nuevo stdout
  • leer de la parte legible de la tubería

La lectura y la escritura deben ocurrir en diferentes hilos o te arriesgas a que tu programa muera de hambre en un extremo del tubo.

Aquí hay una muestra de cómo hacer la redirección en Unix y Windows:

#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 debería imprimirse

buf=>Hi there

(Estoy usando afirmar aquí, porque soy demasiado flojo para hacer una comprobación de error real para este ejemplo)