È possibile cout al terminale e riorientare cout per outfile?
Domanda
Sono in esecuzione di un programma e di reindirizzamento cout
per un file di output, in questo modo:
./program < infile.in > outfile.o
Voglio essere in grado di leggere un'opzione ('-h' o '--help') dalla riga di comando e output un messaggio di aiuto al terminale.C'è un modo posso fare questo, ma hanno ancora il regolare cout
da il resto del programma è il file di output?
Sarebbe cout
essere l'oggetto giusto da utilizzare per una cosa del genere?
Soluzione
Si dovrebbe usare cerr per l'output del messaggio di aiuto a STDERR, che non è incluso nel vostro reindirizzamento a outfile.o.
./program < infile.in > outfile.o
Data:
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 permettono STDOUT per visualizzare, utilizzare
./program < infile.in 2> outfile.o
Bash reindirizzamento è più complessa di quanto si creda, e spesso tutto tranne la forma più semplice ( ">") viene trascurato.
Altri suggerimenti
Se sei su linux puoi usare la pseudo dispositivo /dev/tty
per l'uscita di un terminale di controllo (se qualsiasi).Questo funziona anche se stderr
viene reindirizzato nonché stdout
.Altri sistemi operativi possono prevedere 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;
}
Funzionerà così:
$ ./a.out This goes to stdout This goes to terminal $ ./a.out >/dev/null This goes to terminal
Nota il modo in cui il con i due flussi tamponata in modo indipendente il relativo ordine se sono in uscita per il dispositivo stesso non è necessariamente conservato.Questo può essere regolato da vampate di calore i flussi in tempi adeguati.
~$ cmd | tee log_file
a stdout
DUP al file e
terminale
~$ cmd 2>log_file
per stampare stdout
sul terminale e stderr
in un file
È possibile, come per emettere il messaggio di aiuto a stderr. Stderr è generalmente utilizzato per l'uscita non-normale e si può considerare un paragrafo utilizzo di essere tale uscita.
Una delle cose che ho fatto - non dicendo che questo è sempre appropriato -. È scrivere moduli che hanno qualcosa di simile 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 la scrittura di codice di registrazione dove a volte si desidera visualizzare sul terminale ciò che accade, e altre volte si desidera solo un file di log.
HTH.
Si dovrebbe usare cerr invece di cout. Utilizzando il reindirizzamento shell> reindirizza solo stdout (cout), non stderr (cerr).