2010-01-27 16 views
5

estoy ejecutando un programa y la reorientación de cout a un archivo de salida, así:¿Es posible acceder a la terminal mientras se redirige cout a archivo externo?

./program <infile.in> outfile.o 

Quiero ser capaz de leer en una opción ('-h' o '--help') desde el comando línea y salida un mensaje de ayuda a la terminal. ¿Hay alguna forma de que pueda hacer esto pero aún así tener el cout normal del resto del programa ir al archivo de salida?

¿Sería cout el objeto correcto para usar para tal cosa?

Respuesta

15

Debe utilizar cerr dar salida a su mensaje de ayuda a STDERR, que no está incluido en su redirección para archivar.o.

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

Si, posteriormente, desea redirigir stdout y stderr, puede hacerlo

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

Si desea redirigir solamente STDERR, pero permitir la salida estándar a pantalla, utilice

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

Bash redirection es más compleja que la mayoría la gente se da cuenta, y muchas veces todo lo que no sea la forma más simple (">") se pasa por alto.

+0

increíble, gracias por la ayuda! – zebraman

0

Debe usar cerr en lugar de cout. Usar la redirección de shell> solo redirecciona stdout (cout), no stderr (cerr).

1

Puede dar salida al mensaje de ayuda a stderr. Stderr generalmente se usa para salidas no normales y puede considerar un párrafo de uso como tal salida.

2

~$ cmd | tee log_file a dup stdout para presentar y terminal de
~$ cmd 2>log_file para imprimir stdout en terminal y stderr en un archivo

1

Una de las cosas que he hecho, sin decir que esto siempre es apropiado, son los módulos de escritura que tienen algo así como esta firma.

void write_out(ostream &o); 

Y entonces puedo crear objetos fstream y pasarlos en, o pasar en cout y cerr, lo que necesito en ese momento. Esto puede ser útil al escribir el código de registro donde a veces desea ver en el terminal lo que sucede, y en otros momentos solo desea un archivo de registro.

HTH.

3

Si está en Linux puede usar el pseudodispositivo /dev/tty para enviar a un terminal de control (si corresponde). Esto funcionará incluso si se redirige stderr y stdout. Otros sistemas operativos pueden proporcionar mecanismos similares.

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

Trabajará como esto:

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

Nota la forma en que la de las dos corrientes que se tamponada con independencia del orden relativo si se imprimen en el mismo dispositivo no está necesariamente conservado. Esto se puede ajustar enjuagando las transmisiones en los momentos apropiados.

Cuestiones relacionadas