2010-01-27 7 views
5

Je suis en cours d'exécution d'un programme et la réorientation cout à un outfile, comme ceci:Est-il possible de la borne tout cout redirigeant à Cout outFile?

./program <infile.in> outfile.o 

Je veux être en mesure de lire dans une option (« -h » ou « --help ») de la commande ligne et affiche un message d'aide au terminal. Est-il possible que je peux le faire, mais toujours la cout régulière du reste du programme aller à la outfile?

Est-ce que cout l'objet droit d'utiliser pour une telle chose?

Répondre

15

Vous devez utiliser cerr pour produire votre message d'aide à STDERR, qui ne figure pas dans votre redirection à outfile.o.

Compte tenu ./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, par la suite, vous souhaitez rediriger STDOUT et STDERR, vous pouvez faire

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

Si vous souhaitez rediriger seulement STDERR, mais permettre STDOUT affichage, utiliser

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

Bash redirection est plus complexe que la plupart les gens réalisent, et souvent tout sauf la forme la plus simple (">") est négligé.

+0

génial, merci pour l'aide! – zebraman

0

Vous devez utiliser cerr au lieu de Cout. Utiliser la redirection de shell> redirige uniquement stdout (cout), pas stderr (cerr).

1

Vous pouvez, comme à la sortie, le message d'aide à stderr. Stderr est généralement utilisé pour une sortie non normale et vous pouvez considérer un paragraphe d'utilisation comme tel.

2

~$ cmd | tee log_file à dup stdout déposer et borne
~$ cmd 2>log_file pour imprimer stdout sur terminal et stderr dans un fichier

1

Une des choses que j'ai faites - ne dis pas que c'est toujours approprié - est d'écrire des modules qui ont quelque chose comme cette signature.

void write_out(ostream &o); 

Et puis je peux créer des objets fstream et les transmettre, ou passer Cout et cerr, tout ce que je dois à ce moment-là. Cela peut être utile dans l'écriture du code de connexion où parfois vous voulez voir sur le terminal ce qui se passe, et à d'autres moments vous voulez juste un fichier journal.

HTH.

3

Si vous êtes sous Linux, vous pouvez utiliser le pseudo-périphérique /dev/tty pour émettre vers un terminal de contrôle (le cas échéant). Cela fonctionne même si stderr est redirigée ainsi que stdout. D'autres systèmes d'exploitation peuvent fournir des mécanismes similaires.

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

fonctionne comme ceci:

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

Notez la façon dont le avec les deux courants étant tamponnées indépendamment l'ordre relatif si elles restituent au même dispositif est pas nécessairement conservé. Cela peut être ajusté en rinçant les flux à des moments appropriés.