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 :

Lire un fichier texte pr�-format�


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par d�faut Lire un fichier texte pr�-format�
    Voila je souhaite lire un texte pr�s format�, qui s�pare les diff�rentes donn�es par ";".
    Pour vous en donner un aper�ue :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    "Abramites hypselonotus";"Günther, 1868";"Anostomidés";"23";"27";"0";"6.0";"7.5";"0.0";"4";"15";"0";"14.0";"14.0";"?";"Milieu & Inférieure";"Bassins de l'Amazone et de l'Orénoque";"Herbivore, il risque de manger les plantes de l'aquarium s'il est mal nourri.Lui fournir de la nourriture vegetale souvent pour eviter un carnage aux plantes.
    ";"non déterminé (oeil nu)";
    Actuellemt, je ne sais utiliser que ifstream pour ouvrir mon fichier et j'utilise les flux pour attribuer les valeurs :
    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
     
    ifstream fichier("poissons.txt"); // ouverture du fichier
            if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
        {
            int nbrpoissons; // variable contenant le nombre de poissons donné au début du fichier.
                    fichier >> nbrpoissons;
                    cout << "il y a "<<nbrpoissons<<" poissons dans la BDD.";
                    string texte; // variable contenant le texte lu
                    // cette boucle s'arrête dès qu'une erreur de lecture survient
                    int count = 0;
                    while (!fichier.eof())
                    {
                            fichier >> texte;
                            poissons[count]->setnom( texte );
                            count++;
                    }
          }

    Mais voila le probl�me c'est que cette m�thode ne coupe pas aux bons endroits(";"). En effet elle coupe le texte au niveau des espaces!!

    En C j'aurais utilis� un scanf, mais en C++, je ne sais pas comment faire.

    Si quelqu'un a une id�e, je suis preneur.
    Merci de m'avoir lu en tout cas ;-)

  2. #2
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par d�faut
    Salut,

    Plut�t qu'utiliser eof() pour voir si tu peux continuer � lire, utilise la m�thode good(). Elle ne renvoie vrai que si tout les flags d'erreurs sont "clean".
    Ensuite, pour lire tes lignes, utilise plut�t std::getline, ensuite tu coupe la ligne � chaque point virgule. Regarde la FAQ C++, il me semble qu'il y a un exemple de lecture de fichier texte, �a te montrera un peu mieux la voie � suivre.

  3. #3
    Membre averti
    Inscrit en
    D�cembre 2002
    Messages
    55
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2002
    Messages : 55
    Par d�faut
    en effet, l'op�rateur >> a pour d�limiteur le caract�re d'espacement. Il faut donc red�finir ton op�rateur

    Question: pourquoi ne pas utiliser les expressions r�guli�res ou utiliser qqche comme:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    std::string st;
    while (getline(std::cin,st,';'))
    {
      //actions
    }
    A+

    JC

  4. #4
    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
    Pour analyser un texte, il y a plusieurs techniques :
    - cr�er un analyseur � la main
    - cr�er une grammaire, puis un utilitaire qui g�n�rera automatiquement l'analyseur

    La deuxi�me solution a de nombreux avantages sur la premi�re.
    En particulier, il devient bien plus facile d'�tendre la syntaxe, et on est certain que l'analyseur est correct. On pourra m�me valider l'entr�e en fonction de la grammaire.
    Par contre, il est fort possible que cela ne soit pas autant optimis� qu'un analyseur �crit � la main avec attention.
    Un autre d�savantage c'est que les grammaires tombent dans un certain nombre de cat�gories. Et que certaines syntaxes ne peuvent pas �tre exprim�es par des grammaires simples.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par d�faut
    Tout d'abord merci pour vos deux commentaires, j'en prend bonne note.
    En revanche il me reste une petite question :
    il y a des retour � la ligne dans certaine cha�ne de caract�res que je veux conserver.
    Est ce qu'un getline accompagn� d'une red�finition du d�limiteur "getline(std::cin,st,';')" ne va pas me couper ces cha�nes de caract�res?

  6. #6
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par d�faut
    Si. Dans ce cas, il faudra soit que tu lises tout, et que tu parses les cha�nes pour savoir si elle sont continu�es sur la ligne suivante, soit (solution plus facile), encoder les retours � la ligne � l'�criture du fichier par un d�limiteur � toi.

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Ceci dit, � voir l'exemple de chaine que tu propose, je pr�sume qu'il s'agit d'information concernant une "chose" bien pr�cise...

    A vue d'oeil, je pencherait pour une description d'espece fournissant le nom scientifique, la personne ayant d�couvert l'espece, la classe de l'espece, ainsi que la plupart de ses caract�ristiques...

    Il me semblerait donc int�ressant, si ce n'est pas encore fait, de cr�er une structure ou une classe regroupant, justement, l'ensemble de ces caract�ristiques, afin de se faciliter la vie...

    Cela pourrait prendre la forme de
    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
     
    struct espece
    {
        std::string nom;
        std::string decouvert;
        std::string classe;
        int entier1;/* comme je ne sais pas à quoi correspondent les chiffres :P */
        int entier2;
        int entier3;
        float reel1;
        float reel2;
        float reel3;
        int entier4;
        int entier5;
        int entier6;
        float reel4;
        float reel5;
        type data15;
        std::string chaine4; //(ca représente quoi, milieu et inférieur?)
        std::string habitat;
        std::string remarques;
        std::string observation;
    };
    � L'�criture dans le fichier (si tu dois encore le faire), il te suffira d'�crire chaque membre, en les s�parant par des ; et, � la lecture, de lire syst�matiquement chaque membre en s'arretant au ; en se basant sur le fait que les membres de la classe seront enti�rement �crits, ou ne le seront pas du tout

    J'en profite pour signaler que le fait de choisir d'entourer les valeurs de guillemets dans le fichier n'est pas forc�ment la meilleure id�e qu'on puisse avoir...

    Au pire, si certaines chaines de caract�res sont susceptibles de contenir des ;, tu peux te tourner vers des caract�res plus rarement util�s comme s�parateur: | & ou $ ... voir en choisir un pour repr�senter le retour � la ligne (qu'il te suffira de convertir en \n<-->caract�re choisi apres lecutre ou avant �criture )
    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

  8. #8
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par d�faut
    Oui en fait j'ai d�j� cr�er une classe qui re�oit toutes ces informations.
    Et il faut savoir que ce n'est pas moi qui ai �cris ce fichier, je le r�cup�re sur internet, c'est une base de donn�es contenant des informations sur les poissons d'ornements.
    Et j'ai effectivement fini par choisir le type de solution que tu me propose � savoir :
    1) retravailler le fichier :
    Je remplace toutes les cha�nes ";" par le caract�re | .
    2) je lis le fichier � l'aide de std::getline en sp�cifiant le d�limiteur et j'ins�re simultan�ment l'objet string retourn� dans ma variable.

    ce pendant il me reste � trouver comment convertir un string en float. Je sais d�j� le faire pour des int :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    strtol(texte.c_str(),NULL,10)
    //texte contient l'objet string retourné par std::getline;
    //le deuxième paramètre est un pointeur sur le dernier élément de la chaîne de caractère convertie. Permettra plus tard de vérifier la conversion;
    //10 indique que l'on travaille sur une base décimale.
    Mais cette question pourra faire l'objet d'un nouveau sujet si je ne trouve pas de solutions.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. lire un fichier texte avec different format
    Par najma dans le forum MATLAB
    R�ponses: 6
    Dernier message: 26/04/2011, 12h37
  2. Comment �crire un fichier texte au format MS-DOS ?
    Par fredfred dans le forum Langage
    R�ponses: 9
    Dernier message: 20/01/2005, 09h00
  3. R�ponses: 1
    Dernier message: 24/11/2004, 16h54
  4. [Fichier] Lire un fichier texte long
    Par _Eric_ dans le forum Entr�e/Sortie
    R�ponses: 9
    Dernier message: 18/08/2004, 15h22
  5. R�ponses: 2
    Dernier message: 26/05/2004, 17h53

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