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 ascii complexe


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    F�vrier 2005
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 3
    Par d�faut lire un fichier ascii complexe
    Bonjour a tous,

    Je vous ecris car j'aimerais lire un fichier ascii pas tres banal et je sais pas trop comment m'y prendre...
    Voila, le fichier ressemble a ca:
    var1=0.000
    var2=0.7777
    START VALUES BLABLA
    var3=1000
    var4=200
    REPORT FILE NUM BLABLA
    var5=3666
    [DATA0,1024] first distribution
    2400
    1024
    [DATA1,1024] second districbution
    700
    20
    [DATA2,1024] blabla
    ...

    et ce que j'aimerais lire, c'est seulement les valeurs des variables var2 et var3 , les stocker qqe part, puis lire
    les valeurs situees entre [DATA0,1024] et
    [DATA1,1024] , les stocker dans un tableau1 puis
    lire les valeurs entre [DATA1,1024] et [DATA2,1024] et les stocker dans un tableau2.


    Est-ce que qqun saurait quel est le moyen simple pour y arriver ?

    Merci bcp d'avance!!

    Alexum.

  2. #2
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Par d�faut
    salut
    pourquoi tu n'utilises pas tout simplement un ifstream en faisant des tests sur les lignes lues grace � getLine pour voir si elle correspondent � celles que tu attends?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    F�vrier 2005
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 3
    Par d�faut
    Salut,

    c'est justement avec ca que je ne voie pas comment m'y prendre..
    Par exemple, pour var2, il faudrait que je fasse la getline en demandant a ce que la ligne contienne "var2" et ensuite elimine "var2=" puis transforme le char 0.777 en flottant.

    Pour la partie des tableaux , il faudrait que je sois capable de dire au fichier a partir du moment que tu lis DATA, tu prends en comptes seulement les valeurs en dessous la ligne jusqu'a ce que tu voies une autre ligne qui contient DATA...
    je sais pas comment faire ca...
    as tu un exemple d'un truc dans le genre ?

    Merci,
    Al.

  4. #4
    tut
    tut est d�connect�
    Membre �clair�
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par d�faut
    pour le n�1 regarde std::string::find_first_of() et autres fonctions connexes.
    pour le n�2 : creuse-toi la t�te, ce n'est que de l'algo...

  5. #5
    Membre confirm�
    Inscrit en
    Avril 2002
    Messages
    180
    D�tails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Par d�faut
    Je developpe presentement quelque chause de semblable
    j'utilise les expression reguliaire pour extraire les donner de mes fichier text l'avantage que j'y trouve est une grande souplesse de lecture et d'extraction
    les expression reguliaire permaite d'extraire les valeur d,une chaine de caractere
    j'utilise la lib "C" Regex www.linuxinfor.com/french/man3/regex.html
    celle ci me retourne la position du 1er et du dernier caractere corespondent a un sous ensemble
    Par exemple

    tu recherche les ligne commensent par "var" un entier "=" et suivit d'un nombre et tu veut recuperer le nombre

    l'experssion reguliaire correspondant pourait etre
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ^var[0-9]=([0-9]\.[0-9]{0,4})
    ou ([0-9]\.[0-9]{0,4}) est la sous chaine

    regex retournerait de ton fichier dans un char*
    VAR=0.000
    puis initialiserait une structure regmatch_t avec lex valeur rm.so=4 et rm.eo=8;
    il ne te reste plus qua faire un substr(mr.so,rm.eo) pour la recuperer
    ensuite var=0.777
    blablable.

    ces quand meme unpeut plus complexe que de faire un sinplement un std::Getline() puis tester la ligne retourner mais aven un peut d'imagination ca ofre des posibiliter eppatante

    mois j'ai devloppez une classe CData qui defini un data ayant les membre
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    name//nom du parametre
    format//expression reguliaire
    value//valeur retourner par l'expression reguliaire
    methode//super methode
    ainsi qu,ine classe CSection parent des classe CsubData et CSubExpression
    ou CSubData gere une liste de CData et CExpression gere une list d'expression

    dans un fichier text je configure mon application

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [TEST]
     
          [DATA]//subsection data;
                hit:([0-9])//CData
                mass:([9-0]{0,4},[0-9]{0,4})//CData
          [/DATA]
     
          [EXPRESSION]//subexpression
               GetHit"^hit_number=$(hit);
               GETMASS:^mass_(hit)=$(mass);
          [/EXPRESSION]
    [/TEST]
    ou $(NAME)=a l'expression reguliaire du parametre et _(NAME) a la valeur retourner par l'expression reguliaire
    ainsi a lexecution


    GetHit executera l,expression regiliaire ^hit_number=([0-9])
    retourne en exemple hit_number=8;
    place 8 dans le parametre hit;
    puis execute l,expression reguliaire ^mass8=([9-0]{0,4},[0-9]{0,4})
    retourne en exemple mass8=1234.776[/b]
    et place 1234.776dans le parametre mass

    ces peut-etre pas tres claire mais si la methode t'interesse on en rediscute

    Bonne continuation

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Par d�faut
    sinon, en utilisant des streams, les lignes clef sont (en simplifi�):
    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
     
    //ouverture du fichier
    ifstream streamLecture;
    this->streamLecture.open(fileToOpen.c_str(),ios_base::in );
     
    //lecture d'une ligne
    char chaineLue[500];
    streamLecture.getline(chaineLue,500);
     
    string maLigneLue(chaineLue);  //plus facile a manipuler
    if(maLigneLue.find_first_of("taChaineRecherchee",taPositionDeDepart) == taValeurAttendue)
    {
        //par exemple
        //enregistrer la substring qui t'interesse
    }
    apres pour rep�rer les fins des sections tu te fais un bonne boucle while avec la bonne condition qui va bien et ca devrait rouler tout seul je pense

    Bon courage.

  7. #7
    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
    Nope. D�j� faire un getline libre sera plus simple.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    std::ifstream flux("toto.txt");
    // toujours préférer l'initialisation au moment de la déclaration
    if (!flux) throw std::runtime_error("ne peut ouvrir toto.txt");
     
    std::string ligne;
    while (std::getline(flux, ligne))
    { ... }
    Ensuite, std::string::find_first_of recherche le premier caract�re qui est dans la liste des caract�res recherch�s. (!= chaine de caract�re recherch�e). => std::string::find

    Pour ce qui est des expressions r�guli�res, autant utiliser une biblioth�que C++ comme boost.regex.
    boost.spirit peut �tre pas mal pour des grammaires un peu plus compliqu�es si on dispose d'un compilateur r�cent.
    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...

  8. #8
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Citation Envoy� par Luc Hermitte
    Ensuite, std::string::find_first_of recherche le premier caract�re qui est dans la liste des caract�res recherch�s. (!= chaine de caract�re recherch�e). => std::string::find
    Et en + c'est en FAQ:
    http://c.developpez.com/faq/cpp/?pag..._find_first_of

  9. #9
    tut
    tut est d�connect�
    Membre �clair�
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par d�faut
    en plusplus je l'ai d�ja dit !

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    F�vrier 2005
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 3
    Par d�faut
    Super, merci a tous!
    je vais me debrouiller avec toutes ces infos.
    A+

Discussions similaires

  1. lire un fichier ascii
    Par Noovn74 dans le forum MATLAB
    R�ponses: 1
    Dernier message: 26/06/2014, 13h25
  2. Lire un fichier Ascii ou texte, donnees en bloc pas en colonnes
    Par Fatehcz dans le forum Shell et commandes GNU
    R�ponses: 9
    Dernier message: 27/03/2014, 13h14
  3. R�ponses: 3
    Dernier message: 26/03/2014, 09h16
  4. Comment lire un fichier ASCII ?
    Par ThonySp dans le forum MATLAB
    R�ponses: 2
    Dernier message: 25/06/2013, 08h01
  5. lire fichier ascii
    Par mina86 dans le forum D�buter
    R�ponses: 6
    Dernier message: 15/02/2010, 16h08

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