Forum Programmation.c++ équivalent sprintf

Posté par  (site web personnel) .
Étiquettes : aucune
0
5
juin
2005
Salut,

existe-t-il un equivalent à sprintf pour le C++ par exemple quelque chose comme

ofstream f;
...
f.formatedString(format, arguments);

et qui formatterait la chaîne de caractère.
J'ai cherché sur google mais je n'ai pas trouvé mon bonheur.

merci
  • # ostrstream

    Posté par  . Évalué à 1.

    Tu peux écrire dans une chaine de caractère avec un flux en utilisant la classe ostrstream (qui hérite de ostream).
  • # std::stringstream

    Posté par  . Évalué à 1.

    sprintf() est bien sur utilisable en C++, mais les streams de la STL le remplace avantageusement.

    au passage, sprintf() ne devrait jamais etre utilise car on ne peut pratiquement jamais predire la taille de la chaine resultante. snprintf() le garantit mais le resultat risque d'etre tronque.

    je ne suis pas sur de comprendre ce que tu veux d'apres ton exemple, mais comme sprintf() sert a formatter une chaine en memoire plutot que vers un fichier, je suppose qu'il te faut utiliser la classe stringstream de la STL. elle possede entre autres la propriete d'un ostream et genere la chaine formatee dans un string sous-jacent auquel on accede par la methode str(). l'utilisation classique est :

    #include <sstream>
    ...
    std::stringstream s;
    s << "message bidon : le vecteur possede " << v.size() << " elements\n";
    string msg = s.str();

    tous les types T auxquels correspond un operateur "std::ostream & operator << (std::ostream &, const T &)" (ce qui est le cas des types primitifs bool, int, const char *, etc.) peuvent ensuite etre utilises de la sorte. c'est en general une bonne alternative a une methode toString() qui alourdi le code inutilement.

    par exemple,

    class host {
    ...
    public :
    const string &name() const;
    bool state() const;
    };

    std::ostream & operator << (std::ostream &o, const host &h)
    {
    return o << "host " << h.name() << " (" << (h.state() ? "up" : "down") << ")";
    }

    void timeout(const host &h)
    {
    std::stringstream s;
    s << h << " is not responding\n" "abort ?";
    popup(s.str());
    }

    a noter que la classe ostrstream est obsolete.
    • [^] # Re: std::stringstream

      Posté par  . Évalué à 1.

      au passage, sprintf() ne devrait jamais etre utilise car on ne peut pratiquement jamais predire la taille de la chaine resultante. snprintf() le garantit mais le resultat risque d'etre tronque.


      Tant qu'il n'y a que des nombres et des caractères ça va, si on connait le nombre maximum de bits que peuvent prendre les nombres.

      Perso je trouve que la STL elle pue :/ à la rigueur boost c'est un peu mieux...
    • [^] # Re: std::stringstream

      Posté par  (site web personnel) . Évalué à 2.

      ok, pour ça, ça va mais le problème est le suivant : je ne connais pas à l'avance le format de la chaîne de caractère.
      Donc apparemment, je suis un peu obligé d'utiliser sprintf
  • # boost

    Posté par  . Évalué à 2.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.