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

SL & STL C++ Discussion :

Ifstream > Lecture d'un fichier > Format


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut Ifstream > Lecture d'un fichier > Format
    Bonjour,
    Je doit lire un ficheir de format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #Commentaire
    @X-Y-Z
    #Commentaire
    {X,Y,Z,A}
    {X,Y,Z,A}
    #Commentaire
    {X,Y,Z,A}
    {X,Y,Z,A}
    @
    #Commentaire
    #Commentaire
    @X-Y-Z
    #Commentaire
    {X,Y,Z,A}
    {X,Y,Z,A}
    {X,Y,Z,A}
    {X,Y,Z,A}
    @
    Les commentaires doivent être ignorer, les lignes @X-Y-Z et @ déliment respectivement le début et la fin d'une boucle de chargement dans mon programme. Les variables X,Y,Z,A doivent être récupèrer dans une boucle.

    J'ai tenter de procèder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Tant que getline Flux, '@'
      Getline Flux,'-'
      Getline Flux,'-'
      Getline Flux,'-'
      Tant Que getline Flux, '{')
        Getline Flux, ","
        Getline Flux, ","
        Getline Flux, ","
    Le problème c'est que je ne voit pas comment l'arèter a la rencontre d'un "@\n"

  2. #2
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    A ta place je posterai sous Algos...
    Je comprends pas bien ton prob...
    Il te suffit d'ignorer les lignes commencant par "#" , de faire une boucle qui va de
    à
    ...
    Tu stockes tout ce qui se trouve entre ces deux choses dans une string par exemple

    et tu t'occupes du reste dans un second temps...(
    Les variables X,Y,Z,A doivent être récupèrer dans une boucle.
    )

  3. #3
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Ce qui me pose problème c'est justement faire sa en cpp!!!
    Je ne conais que getline pour récupèrer des chaines. Je préfèrerais regarder tout simplement par quoi commence la ligne selectioner, mais je ne voit pas trop comment faire sa?!

  4. #4
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Et bien on va faire avec ce que tu sais!
    Utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    istream& getline(istream&, string s)
    pour lire la prochaine ligne...
    tu utilise un find
    http://c.developpez.com/faq/cpp/?pag..._find_first_of
    pour vérifier qu'il n'y ait pas le signe # ou @ .

    Ensuite réutilise find(ou variante) pour vérifier que les lignes restantes commencent bien par un "{"....
    Ensuite transforme la ligne commençant par "{" en un tableau/vecteur de char
    http://c.developpez.com/faq/cpp/?pag...TRINGS_to_char
    Il ne te reste plus qu'à extraire les valeurs X,Y,Z et A...
    Bonne chance

  5. #5
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Merci mais comment je fait pour extraire de std::string Var("{x,y,z,a}") x, y, z et a?
    Sachan que je veut récupèrer la valeur dans un int(J'utilise une fonction template qui converti les string en int, template<T> T from_hex(std::string Var)

  6. #6
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Sinon tu peux aussi utiliser ça:
    http://c.developpez.com/faq/cpp/?pag...RINGS_strtonum

    Donc une fois que tu as ton vecteur(moi je fais TOUT avec des vecteurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char nombre1, nombre2, nombre3, nombre 4;
    nombre1=MonVecteur[1]
    nombre2=MonVecteur[3]
    //etc
    ensuite tu transformes les char en int...

  7. #7
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Oui mais je ne peut pas convertire Buffer[5](std::string) par exemple en int. Sa me donne une éreur. Il faut donc que je trouve un moyen de convertire chaque caractère numérique en string. Et puis, la il y a soit 1, soit 2, soit 3... caractère qui forment le chifre.
    Ex: {34,263,9876,1}
    Il y aurais pas un moyen de faire comme en php avec preg_match ?
    Concrètement, imaginon que j'ai std::string Var("{34,263,9876,1}");
    Quel code écrit-tu pour obtenir X,Y,Z,A?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Question bête : le format du fichier t'est-il imposé, ou peux-tu le modifier ? Car dans ce cas tu peux te simplifier énormément la lecture.

    Sinon pour extraire des données séparées par autre chose qu'un espace, n'oublie pas que getline accepte en 3ème paramètre un délimiteur.

  9. #9
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    A ta place je mettrai qqch du genre:
    comme ça c'est plus simple pour scanner...
    tu fais ensuite une boucle qui détecte les "#" ensuite elle scanne tous les signes qui vont jusqu'au prochain "#" et ainsi de suite...

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Si ce n'est pas un exo, il y a quantité de bilbiothèques qui peuvent simplifier la vie.

  11. #11
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    C'est poour mon aplic.
    Pour le moment je ne sais faire qu'avec des get line ou je change le dernier paramètre par un }, un @ ect...
    Le format de fichier m'est aps imposer mais je doit pouvoir placer des commentaire, et structurer mes données en block(ici je les ai simboliser par @) qui contièbnent des coordonées de translation(elles sont ajouter au coordonées de chaque element)
    Donc j'ai fait cette structure car elle me semblais la plus simple.

    Il faut aussi que le format du fichier soit lisible par un humain ^^

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par JC_Master
    C'est poour mon aplic.
    Pour le moment je ne sais faire qu'avec des get line ou je change le dernier paramètre par un }, un @ ect...
    Le format de fichier m'est aps imposer mais je doit pouvoir placer des commentaire, et structurer mes données en block(ici je les ai simboliser par @) qui contièbnent des coordonées de translation(elles sont ajouter au coordonées de chaque element)
    Donc j'ai fait cette structure car elle me semblais la plus simple.

    Il faut aussi que le format du fichier soit lisible par un humain ^^
    Le format le plus simple avec le même contenu serait que chaque ligne commence par un caractère qui indique son contenu (commentaire, début de bloc, contenu de bloc) et que tes nombres soient séparés par des espaces. Tu les récupèreras ensuite avec un stringstream.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    while(getline(file, line)) {
       if (line.size() == 0)
          continue;
       switch(line[0]) {
          case '#': break;
          case '@': startBlock(line); break;
          case ':' : addToBlock(line); break;
          default: handleFormatError(line); break;
       }
    }
     
    void startBlock(std::string const& line) {
       LeBonType x, y, z;
       std::istringstream is(line.substr(1));
       is >> x >> y >> z;
       if (!is) {
          handleFormatError(line);
      } else {
         is >> ws;
         if (!is.eof()) {
            handleFormatError(line); 
      }
    }

  13. #13
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    C'est pas bête ça! J'y avais pas pensé...
    Il me faut vraiment des vacances!

  14. #14
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    C'est quoi les fonctions .substr et la variable ws?

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par JC_Master
    C'est quoi les fonctions .substr
    C'est un membre de std::string qui renvoie une sous-chaine (se terminant a la fin s'il n'y a pas de second argument.

    et la variable ws?
    J'aurais du ecrire std::ws, c'est un manipulateur qui permet de sauter les blancs. Je verifiais qu'il n'y avais aucun non blanc apres le troisieme nombre.

  16. #16
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    D'accord merci j'ai comprit

    Edit : J'ai garder un format similaire. J'ai remplacer la fin des haricots blocks par un *, et j'ai rempalcer - et , par des " ". Sa fonctione impexk ^^ Sinon, je n'ai pas vérifier qu'il ne retait pas de character dans le buffer, parce que si l'utilisateur rajoute un commentaire en fin de ligne...

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

Discussions similaires

  1. [IO] : Pb de lecture d'un fichier au format UTF-8.
    Par Foub dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 25/03/2008, 12h33
  2. lecture simple de fichiers formatés
    Par enicnath dans le forum Langage
    Réponses: 7
    Dernier message: 06/10/2005, 18h06
  3. lecture de fichier au format xls via un prog C++
    Par lepoutho dans le forum C++
    Réponses: 9
    Dernier message: 08/09/2005, 10h23
  4. Lecture de fichier au format XML ??
    Par nico0007 dans le forum Langage
    Réponses: 1
    Dernier message: 07/07/2005, 15h40
  5. [ifstream] pb lecture fichier non sequentielle
    Par bludo dans le forum SL & STL
    Réponses: 3
    Dernier message: 10/02/2005, 21h30

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