IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

sprintf en C++


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 30
    Par défaut sprintf en C++
    Bonjour,
    j'ai une question un peu stupide, mais quelle est la traduction en C++ de sprintf.
    Je m'explique avec ce petit exemple qui ne fait pas grand chose en fait mais qui explique + ou - ce que je voudrai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int i = 1;
    while (...)
    {
       sprintf(name,"image%03d.jpg",i);
       cout << name << endl;
       i++;
    }
    en sortie j'obtiens ainsi :
    image001.jpg
    image002.jpg
    ...
    image010.jpg
    image011.jpg
    ...

    Pour le traduire en C++, j'ai pensé à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int i=1;
        while(...)
        {
            stringstream name;
            name << "image";
            name.width(3);
            name.fill('0');
            name << i;
            name << ".jpg";
            cout << name.str() << endl;
            i++;
        }
    Ca fonctionne, mais n'y a-t'il pas une façon plus naturellle d'écrire cela en C++ ?

    D'avance merci

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int i=1;
    while(...)
    {
        ostringstream name;
        name << "image" << setfill('0') << setw(3) << i << ".jpg";
        cout << name.str() << endl;
        i++;
    }
    Mais c'est pas tellement mieux que ce que tu as fait...

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Je crains qu'il n'y ait hélas, pas mieux.

    Mais si tu as boost, on m'a dit (je n'ai pas vérifié, je n'ai pas boost) que les nostalgiques du printf() comme nous pouvaient utiliser boost::format.

    PS: Les opérations ci-dessus nécessitent le header <iomanip> en plus de <iostream>.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 30
    Par défaut
    Ok je vais aller voir du coté de boost.

    PS: Les opérations ci-dessus nécessitent le header <iomanip> en plus de <iostream>.
    --> Bah, non je n'utilise pas <iomanip> et ca marche

    Mais une question me taraude :
    quelle est la différence entre un stringstream et un ostringstream ?

    Merci a vous 2 pour vos réponses

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    .fill() et .width() n'ont pas besoin de <iomanip>.

    << setfill('0') << setw(3) nécessite <iomanip> (peut-être inclus par <sstream>, mais je serais étonné que ce soit garanti par la norme...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par TuRn3r
    quelle est la différence entre un stringstream et un ostringstream ?
    Tu as trois classes pour manipuler les chaînes de caractères comme des flux :
    - istringstream ;
    - ostringstream ;
    - stringstream.

    Si je ne me plante pas, istringstream sert à récupérer les données d'une chaîne formatée, ostringstream sert à créer une chaîne formatée, et stringstream peut faire les deux.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 30
    Par défaut
    OK Merci bien à tout le monde de votre aide ainsi que pour avoir éclairé ma sombre lanterne.

    En effet, je pense que je vais me tourner vers le booost::format à l'avenir http://www.boost.org/libs/format/doc/format.html


  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        int i=1;
        while(...)
        {
            cout << "image" << << setw(3) << setfill('0') << i << ".jpg" << endl;
            i++;
        }
    Inutile de passer par un flux supplémentaire...

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Mais pour un nom de fichier, l'affichage n'est généralement pas la fonction principale d'un tel formattage.
    L'affichage devait n'être présent qu'à titre d'exemple (et utiliser un autre flux a l'avantage suprême de ne pas modifier les paramètres de cout...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    (et utiliser un autre flux a l'avantage suprême de ne pas modifier les paramètres de cout...)
    Où est-ce que tu vois les paramètres de cout modifiés ?

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par loufoque
    Où est-ce que tu vois les paramètres de cout modifiés ?
    setw et setfill appellent les fonctions ios_base::width et ios_base::fill du flux sur lequel elles sont appliquées et donc modifient les paramètres de cout.

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    La preuve en image...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    #include <iomanip>
     
    using namespace std;
     
    int main()
    {
    	int i = 3;
    	cout << "image" << setw(3) << setfill('0') << i << ".jpg" << endl;
    	cout << i << endl;
    }
    Et non, les paramètres de cout ne sont pas modifiés.

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par loufoque
    Et non, les paramètres de cout ne sont pas modifiés.
    Après vérification, ils le sont bien, mais width est remis à 0 après un appel à operator<< (ISO 22.2.2.2.2-21 et ISO 27.6.2.5.4). Si on change ton exemple pour modifier un autre champ, la base :
    Code Autre preuve en image :) : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <iostream>
    #include <iomanip>
     
    int main()
    {
    	std::cout << std::setbase(16) << 10 << "\n";
    	std::cout << 10 << "\n";
    }

    La sortie est
    À l'exception de width toutes les modifs sont conservées d'un appel à l'autre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connaitre la taille du résultat de sprintf
    Par gege2061 dans le forum C
    Réponses: 6
    Dernier message: 09/01/2006, 14h56
  2. [Débutant(e)] equivalence de sprintf en JAVA
    Par GuillaumeCorbineau dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 06/09/2005, 19h18
  3. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46
  4. pb sprintf
    Par peuf23 dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2005, 17h46
  5. sprintf : le point devient virgule ?!
    Par jula dans le forum C++
    Réponses: 4
    Dernier message: 17/09/2004, 12h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo