2009-11-04 10 views
7

Avevo bisogno di inoltrare lo stdout a file diversi per separare alcune stampe prodotte e il ripristino al normale stdout.freopen: ripristino dello stream originale

ho usato freopen per passare al file in questo modo:

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); 

e funziona in realtà, ma alla fine del processo (mente che stdout viene deviata molte volte nel precedente allo stesso modo) I Non sono in grado di ripristinare lo stdout originale. Ho provato il seguente:

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

ma non sembra funzionare .. solo per informazioni che sto sviluppando su macosx.

Cosa devo fare?

Grazie in anticipo

+0

Si potrebbe desiderare di aggiungere un po 'più in dettaglio, che cosa succede quando si fa il freopen finale()? Restituisce NULL? – unwind

risposta

11

Questo è possibile utilizzando le chiamate fileno, dup e dup2. Ho provato questo su Linux non sono sicuro se questo funzionerà su Mac, ma sono sicuro che otterrete alcune funzioni equivalenti per l'installazione. Verifica se questo codice di esempio funziona per te. Ci scusiamo per la mancanza di gestione degli errori nel codice. :)

#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

Funziona anche su OS X. – laalto

+0

@laalto Gr8, grazie per l'input. –

+1

Modificare questo a #include e quindi controllare i valori di ritorno sulle chiamate fgetpos/fsetpos mostra problemi su Linux: if (fgetpos (stdout, & pos)) perror ("fgetpos"); –

-1

Questo mi sembra un modo indiretto di risolvere il tuo problema. Perché non basta aprire ogni file con fopen() e quindi scrivere sul suo FILE * con fputs, fprintf, fwrite ecc.? Non è necessario reindirizzare lo stdout.

+2

Probabilmente perché un (molto) codice sta scrivendo senza specificare un flusso di output, ad es. usando solo semplici chiamate printf(). Il reindirizzamento dello stdout è quindi un modo per "avvolgere" quel codice e farlo scrivere nella posizione desiderata, senza cambiarlo. Solo a indovinare, ovviamente. – unwind

+1

@unwind la tua ipotesi è corretta, questo è il più probabile uso di freopen. –

+0

Posso effettivamente confermare che questo è il motivo. È un compilatore e ho sempre usato printf per stampare codice asm (ad esempio MOV $ 1, 4.5f) mentre lo creavo e ora non voglio perdere tempo a sostituire le cose .. – Jack

Problemi correlati