flux vers fichier ET vers console en même temps

flux vers fichier ET vers console en même temps - C++ - Programmation

Marsh Posté le 20-09-2004 à 15:13:22    

 Bonjour,
 
  j'aimerais créer un flux 'sortie' pour pouvoir écrire :
                   
       sortie << "machin";
 
  de manière à ce que "machin" sorte vers l'écran et vers un fichier dont j'aurais fourni le nom en initialisant mon flux. J'ai pensé définir une instance d' ofstream en surchargeant << pour diriger en plus les données vers la console... J'aimerais avoir votre avis avant de me lancer là-dedans. Merci d'avance.

Reply

Marsh Posté le 20-09-2004 à 15:13:22   

Reply

Marsh Posté le 20-09-2004 à 15:17:53    

tu t'ennuies pour rien
 
./a.out | tee fichier

Reply

Marsh Posté le 20-09-2004 à 15:43:43    

  Merci pour le tuyeau : c'est vrai que les possibilités des systèmes Unix laissent rêveur...  
 
   Mais  
   (1) je travaille sur Linux ET sur XP,
   (2) en ce moment je réécris du code C en C++; comme je trouve que les flux sont très puissants, j'aimerais les utiliser le plus possible et résoudre mon problème en le codant en C++,
   (3) si la sortie vers la console serait constante, la sortie vers le fichier, elle, serait conditionnée par l'utilisateur du programme APRES le lancement,
   (4) je trouve que c'est un super exercice de programmation !

Reply

Marsh Posté le 20-09-2004 à 18:12:52    

La surcharge me semble une bonne piste, le ++ est fait pour.

Reply

Marsh Posté le 20-09-2004 à 22:53:50    

 J'ai posé le même topic sur le forum de Développez.com et on m'a orienté vers la FAQ de fr.comp.lang c++ paragraphe 27.3 qui explique comment écrire ses propres flux. D'après la discussion à laquelle j'ai assistée, créer une simple classe Flux en surchargeant l'opérateur << ne suffit pas. Je vous tiens au courant si j'ai du nouveau.

Reply

Marsh Posté le 20-09-2004 à 23:28:46    

jouer avec le rdbuf() ?
 
ofstream *LogFile=new ofstream("yop.log" );
 
 if( LogFile && *LogFile )
 {
  cout.rdbuf( LogFile->rdbuf() );
  clog.rdbuf( LogFile->rdbuf() );
  cerr.rdbuf( LogFile->rdbuf() );
 }
 
par exemple. (passer par un pointeur doit pas être nécessaire, donc pas taper je suis à 3 m d'un piscine :D)

Reply

Marsh Posté le 20-09-2004 à 23:29:29    

a non pardon :D
 
là ça redirige tout vers un fichier :D

Reply

Marsh Posté le 21-09-2004 à 01:48:54    

euh ça me parait un peu compliqué tout ça
 
pourquoi ne pas bricoler un peu pour aboutir à quelque chose comme
 
std::cout << LOGIT << "Je m'affiche et je suis écrit dans le fichier\n";
std::cout << "Je ne fais que m'afficher\n";
 
ou plus généralement utiliser une API pour faire du logging de messages ?

Reply

Marsh Posté le 21-09-2004 à 08:15:31    

 Oui Taz, j'ai eu moi aussi la tentation de créer un manipulateur pour résoudre mon problème; mais quitte à faire mon kéké, je persiste à essayer de m'en passer :  après tout, ça permet de réutiliser de l'ancien code C++ sans avoir à ajouter quoi que ce soit aux arguments du flux. C'est l'aspect 'système D' du manipulateur qui me gêne.
 
  Quant à créer une API pour logger mes messages, l'idée me tente mais ce serait la première fois pour moi... Merci pour toutes ces infos.

Reply

Marsh Posté le 21-09-2004 à 10:08:27    

j'ai pas dit créer ... et je vois pas l'aspect système D des manipulateurs

Reply

Marsh Posté le 21-09-2004 à 10:08:27   

Reply

Marsh Posté le 21-09-2004 à 11:19:33    

Taz a écrit :

et je vois pas l'aspect système D des manipulateurs


 
mais clair ! les manipulator sont là justement pour ça [:le kneu]

Reply

Marsh Posté le 21-09-2004 à 12:02:07    

je l ai deja fai mai pas avec les stream j ai utilisé freopen() sous xp pour trapper stdout


---------------
ici c ma signature j ai pas encore reflechi a ce que je vais mettre
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed