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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top