2009-11-04 27 views
7

Necesitaba reenviar la salida estándar a diferentes archivos para separar algunas copias producidas y volver a la normal stdout.freopen: volviendo a la secuencia original

que utilizan freopen para cambiar al archivo de esta forma:

char name[80]; 
memset(name, 0, 80); 
strcpy(name, "./scripts/asm/"); 
strcat(name, m_func->m_name->m_value); 
strcat(name, ".shasm"); 
freopen(name, "w", stdout); 

Y realmente funciona, pero al final del proceso (cuenta que la salida estándar se redirige muchas veces en la misma forma anterior) I No puedo revertirlo a la salida estándar original. Intenté lo siguiente:

freopen("/dev/stdout", "w", stdout); 

pero parece que no funciona ... solo para información que estoy desarrollando en macosx.

¿Qué debo hacer?

Gracias de antemano

+0

Es posible que desee agregar algo más de detalle, ¿qué ocurre cuando se hace el freopen final()? ¿Devuelve NULL? – unwind

Respuesta

11

Esto se puede lograr usando llamadas fileno, dup y dup2. Lo he intentado con Linux, pero no estoy seguro de si funcionará en mac, pero estoy seguro de que obtendrás algunas funciones equivalentes para tu configuración. Vea si este código de muestra funciona para usted. Lo siento por la falta de manejo de errores en el código. :)

#include <stdio.h> 

    main() 
    { 
     int fd; 
     fpos_t pos; 

     printf("stdout, "); 

     fflush(stdout); 
     fgetpos(stdout, &pos); 
     fd = dup(fileno(stdout)); 
     freopen("stdout.out", "w", stdout); 

     f(); 

     fflush(stdout); 
     dup2(fd, fileno(stdout)); 
     close(fd); 
     clearerr(stdout); 
     fsetpos(stdout, &pos);  /* for C9X */ 

     printf("stdout again\n"); 
    } 

    f() 
    { 
    printf("stdout in f()"); 
    } 
+0

Funciona en OS X también. – laalto

+0

@laalto Gr8, gracias por la entrada. –

+1

Modificando esto para #include y luego verifica los valores de retorno en las llamadas fgetpos/fsetpos muestra problemas en Linux: if (fgetpos (stdout, & pos)) perror ("fgetpos"); –

-1

esto parece una manera indirecta de resolver su problema. ¿Por qué no simplemente abrir cada archivo con fopen() y luego escribir en su FILE * con fputs, fprintf, fwrite, etc.? No es necesario redirigir la salida estándar.

+2

Probablemente porque un (muchos) códigos está escribiendo sin especificar un flujo de salida, p. usando simplemente llamadas simples de printf(). Redirigir la salida estándar es entonces una forma de "envolver" ese código y hacerlo escribir en el lugar deseado, sin cambiarlo. Solo adivinando, por supuesto. – unwind

+1

@unwind su conjetura es correcta, este es el uso más probable de freopen. –

+0

Realmente puedo confirmar que esta es la razón. Es un compilador y siempre utilicé printf para imprimir código ASM (por ejemplo, MOV $ 1, 4.5f) al crearlo y ahora no quiero perder el tiempo reemplazando cosas. – Jack

Cuestiones relacionadas