Redirection temporaire entree standard

Résolu
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 7 janv. 2010 à 18:48
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 8 janv. 2010 à 10:35
Bonjour à tous,

Je suis sous linux, et fais une petite class sous emacs.
Une methode "getData" de cette classe affiche des données à l'ecran (par cout).
Il m'est demandé de fournir une méthode pour enregistrer ces données dans un fichier.
Je pensais donc faire une nouvelle methode "saveDataToFile(const string)" qui, dans un premier temps redirigerai la sortie standard vers le fichier en question, puis appelerai la methode "getData" et enfin remettrai la sortie standard à son état initial...
Est-ce qu'une ame charitable pourrait m'indiquer l'instruction pour rediriger la sortie standard vers un fichier ou vers l'écran ?

merci d'avance

Simon

7 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
7 janv. 2010 à 18:56
arf, désolé, pas assez cherché...

trouvé sur cpp.developpez.com :

#include
#include <fstream>

using namespace std;

int main()
{
ofstream Out("Toto.txt");
streambuf* OldBuf = cout.rdbuf(Out.rdbuf());

cout << "Affichage dans Toto.txt"<< endl;

// Restauration du streambuf initial de cout (affichage sur la console)
cout.rdbuf(OldBuf);
}


Merki quand même...

Simon
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
7 janv. 2010 à 19:49
Ce n'est pas super comme technique.
Généralement on utilise un flux, et en fonction de ce qui est instancié le flux est mis dans un fichier, à l'écran, sur le réseau, etc...

Ex:
#include 
#include <fstream>
#include <sstream>

void write(std::ostream& out, const std::string& msg)
{
  out << msg << std::endl;
}

int main()
{
  // Sur la sortie standard
  write(std::cout, "Kikoo in cout");

  // Sur la sortie d'erreur
  write(std::cerr, "Kikoo in cerr");

  // Dans un buffer de chaine de caractere
  std::ostringstream ss;
  write(ss, "Kikoo in string stream");
  std::cout << ss.str() << std::endl;

  // Dans un fichier
  std::ofstream file("toto.txt");
  write(file, "Kikoo in file");

  return 0;
}


using namespace std;

Beurk ! Ne l'utilise jamais !!!
Un article à ce sujet: Du bon usage du using namespace

__________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
7 janv. 2010 à 21:12
En prenant un peu de recul et grâce à ton commentaire, je m'aperçois qu'il vaudrait mieux faire une methode privée getData(<type de sortie>) qui effectue le traitement, et deux methodes publiques qui appellent getData avec au choix la sortie standard ou un fichier en paramètre. Malheureusement, je suis encore un peu léger en c++, donc si tu as une petite suggestion à me donner... elle sera la bienvenue.

C'est tout à fait correcte et me semble une bonne idée.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
8 janv. 2010 à 09:59
Pourrais-tu me dire si tu connais un type de paramètres qui me permettrait d'appeler une fonction en lui passant soit la sortie standard, soit un fichier de sortie ?

Ce n'est pas ce que je faisais dans mon premier exemple ?

Peut être ceci répondra à ta question:
private:
  void write(std::ostream& out, const std::string& msg) const;
public:
  void writeFile(const std::string& filename, const std::string& msg) const
  {
     std::ofstream file(filename); // std::ios::append pour ne pas ecraser, cf la doc d'ofstream
     write(file, msg);
     file.close();
  }
  void writeOutput(const std::string& msg) const
  {
     write(std::cout, msg);
  }
  void writError(const std::string& msg) const
  {
     write(std::cerr, msg);
  }


N'hésite pas, si tu as des questions :)

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
7 janv. 2010 à 20:59
Merci pour ta réponse.

Effectivement, il semblerait que mon code sente la bidouille à plein nez. Ceci dit, il permet d'afficher dans un fichier ou à l'écran sans avoir à "dupliquer" le code (je sais pas si je suis assez clair)
En prenant un peu de recul et grâce à ton commentaire, je m'aperçois qu'il vaudrait mieux faire une methode privée getData(<type de sortie>) qui effectue le traitement, et deux methodes publiques qui appellent getData avec au choix la sortie standard ou un fichier en paramètre. Malheureusement, je suis encore un peu léger en c++, donc si tu as une petite suggestion à me donner... elle sera la bienvenue.

Promis, dès que j'ai un peu de temps, je me penche sur le using namespace.

Simon
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
8 janv. 2010 à 08:34
merci pour ta remarque...
Pourrais-tu me dire si tu connais un type de paramètres qui me permettrait d'appeler une fonction en lui passant soit la sortie standard, soit un fichier de sortie ?

Simon
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
8 janv. 2010 à 10:35
ok, merci, j'avais mal compris... je vais essayer d'améliorer ma class dans ce sens (si j'ai un peu de temps)

Simon
0
Rejoignez-nous