2010-01-27 7 views
5

che sto esecuzione di un programma e riorientare cout ad un file di emissione, in questo modo:È possibile eseguire il cout del terminale durante il reindirizzamento di cout in outfile?

./program <infile.in> outfile.o 

Voglio essere in grado di leggere in un'opzione ('-h' o 'help') dal comando linea e invia un messaggio di aiuto al terminale. C'è un modo per farlo, ma ho ancora il regolare cout dal resto del programma andare al file di uscita?

cout sarebbe l'oggetto giusto da utilizzare per una cosa del genere?

risposta

15

Si dovrebbe usare cerr per l'output del messaggio di aiuto a STDERR, che non è incluso nel reindirizzamento per outfile.o.

Dato ./program <infile.in> outfile.o:

cout << "This writes to STDOUT, and gets redirected to outfile."; 
cerr << "This doesn't get redirected, and displays on screen."; 

Se, in seguito, si desidera reindirizzare sia STDOUT e STDERR, si può fare

./program < infile.in &> outfile.o 

Se si desidera reindirizzare solo STDERR, ma consentono STDOUT a display, utilizzare

./program < infile.in 2> outfile.o 

Bash redirection è più complesso della maggior parte le persone si rendono conto, e spesso tutto tranne la forma più semplice (">") viene trascurato.

+0

fantastico, grazie per l'aiuto! – zebraman

0

È necessario utilizzare cerr anziché cout. Usando il reindirizzamento della shell> reindirizza solo lo stdout (cout), non lo stderr (cerr).

1

Potrebbe essere necessario inviare il messaggio di aiuto a stderr. Stderr viene generalmente utilizzato per output non normali e si può considerare che un paragrafo di utilizzo sia tale output.

2

~$ cmd | tee log_file a dup stdout a file e terminale
~$ cmd 2>log_file stampare stdout sul terminale e stderr in un file

1

Una delle cose che ho fatto - non dire questo è sempre appropriato - è moduli di scrittura che hanno qualcosa come questa firma.

void write_out(ostream &o); 

E poi posso creare oggetti fstream e passarle in, o passare cout e cerr, qualunque cosa ho bisogno in quel momento. Questo può essere utile per scrivere il codice di registrazione dove a volte vuoi vedere sul terminale cosa succede, e altre volte vuoi solo un logfile.

HTH.

3

Se si utilizza linux, è possibile utilizzare lo pseudo dispositivo /dev/tty per l'output su un terminale di controllo (se presente). Funzionerà anche se viene reindirizzato stderr e stdout. Altri sistemi operativi possono fornire meccanismi simili.

E.g.

#include <iostream> 
#include <ostream> 
#include <fstream> 

int main() 
{ 
     std::ofstream term("/dev/tty", std::ios_base::out); 

     term << "This goes to terminal\n"; 
     std::cout << "This goes to stdout\n"; 

     return 0; 
} 

Lavoreranno simili:

 
$ ./a.out 
This goes to stdout 
This goes to terminal 
$ ./a.out >/dev/null 
This goes to terminal 

Nota il modo in cui la con i due flussi bufferizzato indipendente il relativo ordine se viene trasmesso il segnale allo stesso dispositivo non è necessariamente conservato. Questo può essere regolato facendo scorrere i flussi nei momenti appropriati.