2009-11-19 11 views
5

C'è un modo per reindirizzare l'output C++ all'interno del codice? La situazione è questa, sto usando alcuni file .cpp e .h esterni che usano printf per mettere avvisi alla console. Desidero reindirizzare "solo" queste uscite (non le mie) a un file "senza" modificare il loro codice.C++ Redirect Output

Quindi; nel mio programma, posso reindirizzare ouput su un file, e quando metterò qualche reindirizzamento dell'output su console di default, dopo di nuovo su file, così via ...

È possibile?

risposta

7

È possibile utilizzare freopen() su stdout per reindirizzare lo stdout in un file.

+0

+1 per fare la cosa conforme allo standard (e portatile). – DevSolar

+0

è in qualche modo permanente fino alla fine del programma? devo in qualche modo convertirlo di nuovo in console? –

1

printf stamperà sul descrittore di file 1, puoi chiuderlo e aprire un file, questo ti darà un altro fd, possibilmente 1 perché è il file con il valore più basso disponibile, se non non sei stato abbastanza veloce.

Se solo close(1); e quindi int fd = open(file); fd dovrebbe essere 1 se nessuno ha aperto qualcosa tra la chiusura e l'apertura. A quel punto, chiunque stampi su fd numero 1 stamperà sul tuo file.

Questo perché il sistema dovrebbe darti il ​​lowest available file descriptor number in modo da darti 1 che è esattamente dove scrive printf.

Come @roe menzionato, si potrebbe preferire fare un dup() oltre 1 prima per ottenere un altro numero fd in cui è possibile stampare su stdout.

+0

se si desidera continuare a stampare le proprie cose sullo stdout, è necessario prima dup(). Quindi puoi passare avanti e indietro con 'dup2()' se vuoi. – falstro

+0

o scrivi i tuoi dati direttamente sul file duplicato ... Suppongo che sarebbe ancora meglio. ancora bisogno di doppiarlo però. – falstro

+0

Presumendo un sistema POSIX, ovviamente, e anche allora stai facendo cose potenzialmente pericolose dove riapre() si adatta perfettamente al conto. La libreria C e POSIX non si combinano bene. Mi tengo sempre aperto()/read()/write()/close() e fopen()/fread()/fwrite()/fclose() a parte. – DevSolar