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

alexum lire un fichier ascii complexe 14/02/2005, 10h51
traiangueul salut pourquoi tu n'utilises... 14/02/2005, 15h40
alexum Salut, c'est justement... 14/02/2005, 15h50
tut pour le n°1 regarde... 14/02/2005, 17h45
philippe V Je developpe presentement... 14/02/2005, 19h24
traiangueul sinon, en utilisant des... 15/02/2005, 09h05
Luc Hermitte Nope. Déjà faire un getline... 15/02/2005, 11h07
Aurelien.Regat-Barrel Et en + c'est en FAQ:... 15/02/2005, 11h22
tut en plusplus je l'ai déja dit ! 15/02/2005, 15h16
alexum Super, merci a tous! je vais... 16/02/2005, 09h05
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 292
    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 292
    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