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 :

Recherche dans un fichier texte


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Yazoo70
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 133
    Par défaut Recherche dans un fichier texte
    Salutations!

    Mon programme est censé lire et chercher dans un fichier nommé donnees.txt .
    Les données se présentent comme ca:

    SITE Reims
    IP xxx.xxx.xxx.xxx
    MASQUE xxx.xxx.xxx.xxx
    PASSERELLE xxx.xxx.xxx.xxx
    DNS xxx.xxx.xxx.xxx
    WINS xxx.xxx.xxx.xxx
    FIN 0
    et voici mon code (qui va en faire vomir plus d'un ) pour rechercher les données spécifiques à un site :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    cout<<"Nom du site voulu:";
    cin>>nomsite;
    ifstream fb("C:/.../donnees.txt");
    fb>>type>>valeur;
    if ( fb ) 
    {
         while ( getline( fb, ligne ) )
         {
              if(valeur==nomsite)
              {
                    while ( getline( fb, ligne ) )
                    {
                         if(type=="IP")
                         {
                         ip=valeur;
                         }
                         if(type=="MASQUE")
                         {
                         masque=valeur;
                         }
                         if(type=="PASSERELLE")
                         { 
                         passerelle=valeur;
                         }
                         if(type=="DNS")
                         {                     
                         dns=valeur;
                         }
                         if(type=="WINS")
                         { 
                         wins=valeur;
                         }
                         if(type=="FIN")
                         {
                         break;
                         }
     
                         fb>>type>>valeur;
                    } 
               }
               fb>>type>>valeur;
         }
    }
    fb.close();
    En gros,
    -je demande le nom du site dont il faut extraire les données.
    -J'ouvre le fichier.
    -Je test si il existe.
    -Je le lis ligne par ligne.
    -Dès qu'il rencontre le bon nom de site, je réouvre une nouvelle lecture ligne par ligne a partir de la ou il sotcke pour chaque type sa valeur dans des variables différentes jusqu'a ce qu'il arrive au type FIN.
    -ensuite je fini en fermant le fichier.

    Le problème c'est qu'il n'arrive jamais à trouver l'IP!
    il passe du type SITE au type MASQUE sans trouver le type IP entre les deux alors qu'il est bien présent dans le fichier...
    C'est probablement dû au fait que je réouvre une lecture ligne par ligne, et il doit sauter une ligne mais je ne sais pas comment régler ce problème

    Merci d'avance à ceux qui auront pris le temps de lire et de répondre !

    Edit: En gros si je fais un juste apres le deuxième while, il me met :
    SITE
    MASQUE
    PASSERELLE
    DNS
    WINS
    Donc il fait l'impasse sur l'IP, pour une raison mystérieuse

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    juste pour verifier ta théorie sur la cause de l erreur, essaye de remonter une ligne dans le fichier avant la deuxième lecture de ligne (avec std::basic_istream::tellg).

    Sinon, d une manière generale, j aime pas trop le fait de recuperer des lignes dans le meme fichier depuis plusieurs endroit differents. Mais a chacun son algorithmie !

  3. #3
    Membre éclairé Avatar de Yazoo70
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 133
    Par défaut
    Citation Envoyé par ZaaN
    juste pour verifier ta théorie sur la cause de l erreur, essaye de remonter une ligne dans le fichier avant la deuxième lecture de ligne (avec std::basic_istream::tellg).
    Tu peux être un peu plus explicite ??
    je suis vraiment un novice et le "std::basic_istream::tellg" je n'ai vraiment aucune idée de ou le placer ni ce que ca va faire

    J'ai cherché un peu mais je ne comprends toujours pas l'utilisation de tellg
    j'ai inséré ça comme code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ....
    if(valeur==nomsite)
             {
              int orh=fb.tellg();
              cout<<orh<<endl;
              while ( getline( fb, ligne ) )
              {
    ....
    ca me renvoie 36 pour le premier site, 153 pour le second .... mais je sais pas quoi en faire

    Citation Envoyé par ZaaN
    Sinon, d une manière generale, j aime pas trop le fait de recuperer des lignes dans le meme fichier depuis plusieurs endroit differents. Mais a chacun son algorithmie !
    Si tu peux me proposer une solution qui me permette de rendre ca plus clair et lisible, je suis tout ouïe, au contraire !

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    'Alut.

    Code :

    .... if(valeur==nomsite) { int orh=fb.tellg(); cout<<orh<<endl; while ( getline( fb, ligne ) ) { ....

    ca me renvoie 36 pour le premier site, 153 pour le second .... mais je sais pas quoi en faire
    Ce ne serait pas la fin de tes IP?

    Je pense que le fait que tu mélange allégrement les getline et les fb>>... cause ton probleme.

    Je te conseille de n'utiliser que les getline pour lire ligne par ligne et de te servir des outils des string pour retrouver tes valeurs.

  5. #5
    Membre éclairé Avatar de Yazoo70
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 133
    Par défaut
    Citation Envoyé par Albenejean
    'Alut.


    Ce ne serait pas la fin de tes IP?

    Je pense que le fait que tu mélange allégrement les getline et les fb>>... cause ton probleme.

    Je te conseille de n'utiliser que les getline pour lire ligne par ligne et de te servir des outils des string pour retrouver tes valeurs.
    Non mais fb c'est le nom de mon fichier ca sert pas à extraire les valeurs... ou alors j'ai mis comme nom de fichier le nom d'une fonction que je connaissais pas, ce qui n'est pas improbable mais normalement elle apparaîtrait en caractère gras non?
    Sinon je maitrise pas trop les "outils des strings" :/

  6. #6
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    la fonction tellg permet de deplacer la position de lecture dans un stream standard (fstream)

    Au niveau de l'algorithme, je pensais à un truc du genre :

    une lecture unique de ligne dans un boucle
    ensuite un switch avec tes differents parametres (IP,SITE,etc...)
    puis les conditions de lecture/enregistrement des donnée
    (ex si tu as rencontré le SITE désiré, tu leve un flag qui fera que tu lit les autre paramètre jusqu'à rencontre d'un autre SITE).

    voila voila, j ai ecrit c à la volée mais ca devrait suffire

  7. #7
    Membre éclairé Avatar de Yazoo70
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 133
    Par défaut
    Citation Envoyé par ZaaN
    la fonction tellg permet de deplacer la position de lecture dans un stream standard (fstream)

    Au niveau de l'algorithme, je pensais à un truc du genre :

    une lecture unique de ligne dans un boucle
    ensuite un switch avec tes differents parametres (IP,SITE,etc...)
    puis les conditions de lecture/enregistrement des donnée
    (ex si tu as rencontré le SITE désiré, tu leve un flag qui fera que tu lit les autre paramètre jusqu'à rencontre d'un autre SITE).

    voila voila, j ai ecrit c à la volée mais ca devrait suffire
    J'ai deja essayé le coup de l'arret de la boucle quand il rencontre un autre SITE, mais comme le premier type qu'il a quand il rentre dans la boucle c'est un SITE, il stop direct. c'est d'ailleur pour ca que j'ai créé le type FIN avec la valeur obsolète 0 pour me donner une solution de sortie.
    Sinon comment tu positionne la position de lecture avec tellg ??
    ca pourrait me permettre effectivement d'avancer directement au type IP et de pouvoir supprimmer le type FIN et de mettre le type SITE comme condition de sortie
    (Ce qui résoudrai par la même occasion le fait qu'il fasse l'impasse sur le type IP lors de l'extraction...a moins que ca ne fasse que déplacer le problème sur le type MASQUE....)

  8. #8
    Membre éclairé Avatar de Yazoo70
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 133
    Par défaut
    Bon j'ai montré mon problème à un pote qui m'a donné la solution!
    Donc je la poste au cas ou ca puisse servir à quelqu'un:
    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
     
                    cout<<"Nom du site voulu:";
                    cin>>nomsite;
                    ifstream fb("C:/.../donnees.txt");
                    bool quit=false;
                    while ( !quit )
                    {
                            fb>>type>>valeur;
                            getline ( fb, ligne );
                            if (valeur==nomsite)
                               quit=true;
                    }
                    quit=false;
                    while ( !quit )
                    {
                            cout << type << endl; 
                            fb>>type>>valeur;
                            getline ( fb, ligne );
                            if (type=="IP")
                               ip=valeur;
                            if (type=="MASQUE")
                               masque=valeur;
                            if(type=="PASSERELLE")
                               passerelle=valeur;
                            if(type=="DNS")
                               dns=valeur;
                            if(type=="WINS")
                               wins=valeur;
                            if(type=="FIN")
                              quit=true;    
                    }
    Voila, résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EasyPHP] recherche dans un fichier texte
    Par cflo91 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 19
    Dernier message: 03/07/2007, 15h33
  2. recherche dans un fichier texte en perl(débutant)
    Par Shyboy dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2006, 23h53
  3. [VB]Recherche dans un fichier texte
    Par mirascheat dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 26/09/2005, 12h11
  4. Recherche dans un fichier texte volumineux.
    Par Actarus69 dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 27/07/2005, 17h39
  5. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57

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