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 �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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"
    Mes articles D�veloppez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Membre �m�rite 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
    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 �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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?!
    Mes articles D�veloppez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Membre �m�rite 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
    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 �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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)
    Mes articles D�veloppez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  6. #6
    Membre �m�rite 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
    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 �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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?
    Mes articles D�veloppez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 �m�rite 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
    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 confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    Par d�faut
    Si ce n'est pas un exo, il y a quantit� de bilbioth�ques qui peuvent simplifier la vie.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  11. #11
    Membre �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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 ^^
    Mes articles D�veloppez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  12. #12
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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 �m�rite 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
    Par d�faut
    C'est pas b�te �a! J'y avais pas pens�...
    Il me faut vraiment des vacances!

  14. #14
    Membre �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par d�faut
    C'est quoi les fonctions .substr et la variable ws?
    Mes articles D�veloppez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  15. #15
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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 �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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...
    Mes articles D�veloppez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

+ 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