2010-01-27 10 views
5

Ich bin ein Programm läuft und cout zu einem outfile Umleitung, etwa so:Ist es möglich, zum Terminal zu springen, während cout in outfile umgeleitet wird?

./program <infile.in> outfile.o 

Ich möchte eine Option, um lesen können (‚-h‘ oder ‚--help‘) von dem Befehl Linie und geben Sie eine Hilfemeldung an das Terminal aus. Gibt es einen Weg, wie ich das tun kann, aber immer noch die normale cout aus dem Rest des Programms in das Outfile gehen?

Wäre cout das richtige Objekt für so etwas?

Antwort

15

Sie sollten cerr zur Ausgabe Ihrer Hilfe Nachricht an STDERR, die in Ihrer Umleitung enthalten ist, nicht verwenden, um Datei outfile.o.

Gegeben ./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."; 

Wenn später, Sie beide STDOUT und STDERR umleiten möchten, können Sie

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

tun, wenn Sie nur STDERR umgeleitet werden soll, sondern erlauben STDOUT Anzeige, Verwendung

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

Bash redirection ist komplexer als die meisten Menschen erkennen, und oft wird alles außer der einfachsten Form (">") übersehen.

+0

genial, danke für die Hilfe! – zebraman

0

Sie sollten Cerr anstelle von Cout verwenden. Shell-Umleitung verwenden> leitet nur stdout (cout), nicht stderr (cerr) um.

1

Sie können die Hilfemeldung an stderr ausgeben. Stderr wird normalerweise für nicht normale Ausgaben verwendet, und Sie können einen Verwendungsabsatz als solche Ausgabe betrachten.

2

~$ cmd | tee log_file dup stdoutund Terminal
~$ cmd 2>log_file drucken stdout auf Terminal und stderr in eine Datei

1

Eines der Dinge, die ich getan habe - nicht zu sagen, dass das immer angemessen ist - sind Schreibmodule, die so etwas wie diese Signatur haben.

void write_out(ostream &o); 

Und dann kann ich fstream Objekte und geben sie in, oder Pass in cout und cerr, was ich brauche, um zu diesem Zeitpunkt zu erstellen. Dies kann hilfreich sein beim Schreiben von Logging-Code, wo Sie manchmal sehen möchten, was passiert, und manchmal möchten Sie nur eine Log-Datei.

HTH.

3

Wenn Sie Linux verwenden, können Sie das Pseudogerät /dev/tty zur Ausgabe an ein kontrollierendes Terminal (falls vorhanden) verwenden. Dies funktioniert auch, wenn stderr umgeleitet wird, sowie stdout. Andere Betriebssysteme können ähnliche Mechanismen bereitstellen.

z.

#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; 
} 

wird wie folgt arbeiten:

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

Hinweis hin, dass die mit den beiden Strömen unabhängig die relative Reihenfolge gepuffert werden, wenn sie an dasselbe Gerät ausgeben nicht notwendigerweise erhalten. Dies kann durch Spülen der Ströme zu geeigneten Zeiten eingestellt werden.