Redirection temporaire entree standard [Résolu]

Signaler
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
-
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
-
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

Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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
Messages postés
3818
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
23 septembre 2020
112
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]
Messages postés
3818
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
23 septembre 2020
112
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]
Messages postés
3818
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
23 septembre 2020
112
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]
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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