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 :

Récupération de valeurs particulières lors de la lecture de txt


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Récupération de valeurs particulières lors de la lecture de txt
    Bonjour a tous,

    Je suis débutant en langage C-C++ bien que j'ai tout de même quelques notions. Dans le cadre d'un projet d'étude, j'ai pour mission réaliser un programme qui convertis des valeurs. Seulement avant de passer a la conversion je dois d'abord "sélectionner" les valeurs que j'aurai a convertir. Donc pour le moment j'ai toutes les valeurs dans un fichier txt comme ceci par exemple :


    01 0m 12 01 ff 00
    00 21 23 ff 01 87
    p2 18 ff 10 87 54
    12 ff 57 j7 15 09
    ff h6 12 00 j4 22



    En fait je cherche a effacer les valeurs "inutiles" puis sélectionner les 2 valeurs apres ff par exemple.
    donc il faudra que je puisse garder uniquement 00 00 / 01 87 / 57 j7 et h6 12 pour les mettre dans des variables ou tableaux.

    Vous remarquerez que les "ff" sont a la même 'distance' ce qui est le cas dans le 'vrai' fichier txt (qui fais près d'une centaine de Mo au passage).

    Le seul code (bien maigre) que j'ai pour l'instant reussi a faire est le suivant


    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
    24
    25
    26
    27
    #include <iostream>
    #include <string>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
        ifstream fichier("test.txt");
        string ligne;
     
    while(!fichier.eof())
    {
        while(getline(fichier,ligne))
        {
            if(ligne.find("ff") == 0)
                {
                    string value = ligne.substr(3, ligne.length());
                    cout<<"here it is "<<value<< endl;
                }
     
        }
    return 0;
     
    }
     
    }



    il me renvoie ( "here it is : h6 12 00 j4 22" ). En fait j'arrive seulement a écrire un code qui détecte"ff" (si il est situé au début de la ligne) et qui me renvoie tout ce qu'il y a après (donc qui relève tout ce qui se situe 3 cases après "ff" grace a substr) .

    Ce n'est bien sur pas ce que je souhaite au final mais je ne sais pas comment améliorer le code et quelles fonctions je devrais utiliser. Je suis un peu perdu.

    Pourriez-vous s'il vous plait m'indiquer quelques pistes ?

    Pour ne rien vous cacher je ne sais pas si il est mieux d'effectuer ce code en C ou C++ (bien que je preferai le faire en C++ puisque je dois ensuite travailler avec Qt).

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Utilise les balises CODE pour plus de lisibilité.

    Sinon, tout le C ainsi est reprise dans le C++, donc à part des problème de rapidité (négligeable) du C++, tu n'as pas tellement de raison d'utiliser le C plutôt que le C++ (surtout si derrière tu utilises Qt)


    Tu arrives déjà à mettre dans un string toutes les valeurs suivant le 'ff' de la ligne.
    Pour sélectionner les deux valeurs suivant les 'ff', il te suffit juste de mettre ton string dans un flux et de découper ton flux selon les ' ' ?
    Ensuite, tu sélectionne le 1er et le 2ème élément (s'ils n'existent pas, ils seront égaux à 0).

    Après, je ne suis pas tout à fait sûr de comprendre ce que tu veux faire.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Désolé je ne comprends pas bien ce que tu veux dire par
    Pour sélectionner les deux valeurs suivant les 'ff', il te suffit juste de mettre ton string dans un flux et de découper ton flux selon les ' ' ?
    En fait pour l'instant je souhaite sélectionner uniquement les 2 valeurs apres chaque "ff " et ignorer les autres.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    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
     
    #include <sstream>
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        string toto = "rr rr rr";
        istringstream iss(toto);
        string mot[2];
        for(i=0, i<2, i++)
        {
             std::getline( iss, mot[i], ' ' )
        }
    }
    http://cpp.developpez.com/faq/cpp/?p...#STRING_tokens

    Je pense que c'est ce que tu cherches.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Utilise getline, puis explore ta chaîne dans un while, en utilisant isspace.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Hello les gars je commence a paniquer pour mon projet.,

    J'ai essayé de suivre la methode du getline et du isspace...

    Mon programme analyse le fichier txt et a chaque espace qu'il trouve, il créée un passage a la ligne.
    (sauf que cela ne fonctionnait pas quand il détectait un retour a la ligne(saut de ligne), donc j'ai traffiqué le getline).

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <ctype.h>
     
    using namespace std;
     
    int main()
    {
        ifstream fichier("test.txt");
        string ligne;
     
        while(!fichier.eof())
        {
            while(getline(fichier,ligne, '.'))
            {
                int c;
                int i=0;
                while (ligne[i])
                    {
                        c=int(ligne[i]);
                        if (isspace(c))
                            {
                                 c='\n';
                            }
                        putchar(c);
                        i++;
                    }
            }
        }
     
    return 0;
     
    }

    Donc j'obtiens ceci :

    01
    0m
    12
    01
    ff
    00
    00
    21
    23
    ff
    01
    87
    ....



    De plus je ne sais pas comment continuer.

    En fait une fois que j'ai une valeur par ligne je dois pouvoir lire et analyser ligne par ligne (nouveau getline) le nouvel agencement et ne conserver que les valeurs que je souhaite (dans un tableau par exemple)...

    J'ai beaucoup de mal a piger tout ce que je trouve sur les forums pour trouver et ne conserver que certains caractères.

    Est ce que je dois créer un nouveau fichier texte avec chaque valeur en colonne et puis faire un if pour eliminer ce que je ne souhaite pas ?

    Est-ce que je peux effectuer les opérations de recherche de caractere directement dans le while ?

    J'ai essayé de faire un test de condition pour chaque lecture de ligne sans succes.

    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
    24
    25
    26
    while(!fichier.eof())
        {
            while(getline(fichier,ligne, '.'))
            {
                int c;
                int i=0;
                while (ligne[i])
                    {
                        c=int(ligne[i]);
                        if (isspace(c))
                            {
                                 c='\n';
                            }
                        putchar(c);
                        i++;
     
                        while(getline(fichier,ligne1))
                        {
                        if (ligne1[i]=='01')
                            {
                            cout<<"ok"<<endl;
                            }
                        }
     
                    }
            }

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    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
     
    #include <sstream>
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        ifstream fichier("test.txt");
        string tmp;
        string resultat[10];
        int i = 0;
        while(i < 10//si tu attend 10 valeurs sélectionnées
        {
                while(tmp != 'ff')
                        std::getline(fichier, tmp, ' ' );//lit jusqu'à rencontrer ta valeur ff
                std::getline(fichier, resultat[i], ' ' );//met le premier élément suivant dans le tableau des résultats
                i++;
                std::getline(fichier, resultat[i], ' ' );//met le deuxième élément dans le tableau des résultats
                i++;
        }
    }
    Après, il faut que tu testes si il y a un retour à la ligne ou non et si tu es arrivé au bout de ton fichier ou non.

    Sinon pas la peine de passer par un fichier temporaire vu que tu peux mettre directement un string dans un flux (cf mon dernier post)

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour merci a toi, j'ai essayé de prendre et modifier ton exemple mais je n'y arrive pas vraiment... Ou faut t il placer ce code ?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    N'est-ce pas mieux de passer par boost/tokenizer puis de mettre les valeurs dans un tableau?

  10. #10
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Je dirais même qu'il vaudrait mieux passer par boost.spirit !

    Non, le plus simple, surtout vu que le format est super simple, est de "tokenizer" avec getline, puis de récupérer à la main les valeurs intéressantes.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/06/2010, 15h15
  2. Problème lors de la récupération des valeurs à partir du modèle EMF
    Par ziad.shady dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 02/04/2009, 15h08
  3. Récupération de la valeur saisie lors d'un onKeyPress
    Par Mat67 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/08/2008, 11h51
  4. [MySQL] syntaxe variable lors d'une récupération de valeurs après mysql
    Par mussara dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/11/2006, 13h30
  5. Valeur null lors de la lecture apres un insert
    Par omlip dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2006, 13h56

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