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

Langage C++ Discussion :

Equivalent de fscanf() C


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Points : 48
    Points
    48
    Par défaut Equivalent de fscanf() C
    Bonjour,
    j'ai un fichier agencé comme ceci, exemple: 12 - 45 - ab cd - 45
    Je ne vois pas comment adapter mon problème avec les flux de lecture du c++ sachant que "ab cd" doit être récupéré dans un string et que l'espace doit être considéré (pas d'arrêt de la lecture dans le fichier après "ab").
    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    Tu peux déjà commencer par lire la ligne complète...

    Cela se fait (cf l'entrée de la FAQ) sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    std::ifstream ifs("fichier.txt"); // le fichier à lire
    if(ifs) //teste l'existence du fichier
    {
        std::string ligne; // une chaine pour récupérer une ligne complète
        std::getline(ifs,ligne); // lecture de toute une ligne
    }
    Tu auras remarqué l'utilisation de getline, dont il existe deux prototypes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    istream& getline ( istream& is, string& str );
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    istream& getline ( istream& is, string& str, char delim );
    Cette fonction prend en paramètre un flux d'entrée, de n'importe quel type, ce qui fait que ca peut etre un ifstream (pour les fichier ), un istringstream (pour la conversion) ou meme un flux d'entrée standard (cin), une chaine de caractères à remplire et éventuellement un caractère servant de délimiteur.

    Si le caractère servant de délimiteur n'est pas fournit, c'est, par défaut, le retour à la ligne qui est utilisé

    Il faudrait, bien évidemment, voir sous quelle forme récupérer les valeurs numériques ( 12 et 45), car il serait sans doute de les récupérer dans des variables de type numériques, mais comme il est particulièrement facile de les récupérer sous forme de chaine, et à défaut de savoir si cela ne convient pas, je vais me contenter d'estimer que cela te convient d'avoir des chaines "12" et "45"

    Une fois la chaine lue dans le fichier, je te propose donc de la passer à un flux de conversion (stringstream) car ce devra de toute façons être fait quel que soit le cas de figure , puis d'utiliser de nouveau std::getline, das sa version prenant un délimiteur afin de séparer les données sur base du caractère ... '-'

    Le code qui suit celui que j'ai montré (en fait qui s'insère avant l'accolade fermante) ressemblera donc à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    std::stringstream ss; //création d'un flux de conversion
    ss<< ligne;        // que l'on rempli avec la ligne que l'on vient de lire
    // une chaine de caractères par donnée à récupérer
    std::string first;
    std::string second;
    std::string third;
    std::string fouth;
     
    std::getline(ss,first,'-'); // récupère "15"
    std::getline(ss,second,'-'); // récupère "45" (le premier)
    std::getline(ss,third,'-'); // récupère "ab cd"
    std::getline(ss,fouth); //récupère "45" (le second)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Points : 48
    Points
    48
    Par défaut
    Merci pour cette réponse très complète!!!
    Cela dit je dois récupérer mes entiers dans des variables de type entier (logique ) du coup je pensais tous récupérer dans le même string et faire ensuite des conversions vers la variable de type approprié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::getline(ss,string,'-'); string >> entier1;
    std::getline(ss,string,'-'); string >> entier2;
    std::getline(ss,string,'-'); string >> chaine1;
    std::getline(ss,string); string >> entier3;
    Est ce la bonne façon de procéder? (j'insérerais probablement des tests pour savoir si ce que l'on a récupérer est conforme au type de stockage ou non).

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Dans ce cas, il faudra en fait plutot "'jouer" un peu avec les différentes possibilités (car la conversion d'une chaine en valeur numérique impliquerait de nouveau le recours à un flux de conversion... et cela deviendrait vraiment un peu trop

    On en arriverait donc sans doute à quelque chose proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* toujours la meme chose pour ouvrir le fichier et pour lire la ligne :D */
    int first;
    int second; 
    std::string third;
    int fourth;
    char dummy; // pour récupérer le caractère de séparation :D
    std::stringstream ss;
    ss<<ligne;
    ss >>first >> dummy
       >>second >> dummy;
    std::getline(ss,third, '-');
    ss >> fourth;
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Points : 48
    Points
    48
    Par défaut
    Dac' donc en fait on utiliserait la méthode du getline() que pour gérer l'espace dans la chaine de caractère.
    En tout cas merci, je trouve ça un poil moins simple que fscanf() mais bon ^^

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/03/2008, 14h50
  2. Equivalent au fscanf
    Par thierryG dans le forum Windows
    Réponses: 1
    Dernier message: 22/10/2007, 09h22
  3. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    Réponses: 7
    Dernier message: 14/08/2002, 11h55
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 07h43

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