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 :

Chercher une chaine de caractères dans un fichier avec fgets


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut Chercher une chaine de caractères dans un fichier avec fgets
    Bonjour, j'essaie de chercher une chaine de caractère dans un fichier avec la fonction fgets mais ca ne fonctionne pas comme prévu. La chaine de caractère n'est trouvée que si elle est à la dernière ligne de mon fichier ou si elle est la seule chaine dans le fichier.
    Exemple 1: les chaines sont de longueur variables et stockées comme suit dans le fichier
    Chaine 1
    Chaine 2
    Chaine 3
    ==>Impossible de trouver les deux premières chaines. Mais si je demande la troisième, aucun souci.
    Exemple 2:
    Chaine 1
    La recherche me trouve bien Chaine 1.

    Voici la partie du code qui s'occupe de chercher la chaine:
    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
     
    int stop=0;
    if (fichier!=NULL)
          {                 
           do 
             {                   
              fgets(buffer,sizeof(buffer),fichier);
              //si la chaine est egale a celle dans le buffer
              if (strcmp(chaine_a_trouver,buffer)==0) 
                {
                 //Modification de l'état de connexion             
                 gtk_label_set_text(GTK_LABEL(pApp->pConxState),chaine;                  
                 stop=1;
                 break;
                }         
             }  
           while( (fgets(buffer,sizeof(buffer),fichier)!=NULL) );        
     
           if (stop!=1)
             gtk_label_set_markup(GTK_LABEL(pApp->pConxState),"<span font_desc=\"Verdana 10\" foreground=\"#FF0000\">Chaine non trouvee dans le fichier \n \tVeuillez recommencer</span>");          
     
          fclose(fichier);
          }

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Il y a un problème dans a boucle do/while :

    Si on la simplifie, on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do {
      lire une ligne;
    } while(lire une ligne);
    Je pense que ton programme est incapable de trouver une ligne si celle ci a un numéro pair.

    Déjà, on peut écrire à la place du do/while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while( (fgets(buffer,sizeof(buffer),fichier)!=NULL) )
    {                   
        /* si la chaine est egale a celle dans le buffer */
        if (strcmp(chaine_a_trouver,buffer)==0) 
        {
            /* Modification de l'état de connexion */
           gtk_label_set_text(GTK_LABEL(pApp->pConxState),chaine;                  
           stop=1;
           break;
       }         
    }
    Après, il faut savoir que fgets laisse les caractères '\n' présent en fin de ligne. Je ne pense pas qu'il soit présent dans chaine_a_trouver.

    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
    while( (fgets(buffer,sizeof(buffer),fichier)!=NULL) )
    {                   
        /* enlever un \n éventuel */
        char *p = strchr(buffer, '\n');
        if(NULL != p) {
            *p = '\0';
        }
        /* si la chaine est egale a celle dans le buffer */
        if (strcmp(chaine_a_trouver,buffer)==0) 
        {
            /* Modification de l'état de connexion */
           gtk_label_set_text(GTK_LABEL(pApp->pConxState),chaine;                  
           stop=1;
           break;
       }         
    }

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    [STRIKE]Le probleme est résolu. Pour ceux qui auraient le meme probleme. Mon erreur était de rappeler la fonction fgets dans la condition du while.
    Voici la version modifiée qui marche comme je veux.[/STRIKE]

    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
     
        if (fichier!=NULL)
          {                  
           do 
             {                   
              if ( (fgets(buffer,sizeof(buffer),fichier)!=NULL)  || (strcmp(chaine_a_trouver,buffer)==0) )
                {
                   stop=1;
                   //Modification de l'état de connexion             
                   gtk_label_set_text(GTK_LABEL(pApp->pConxState),chaine);                  
                   break;
                  }                     
             }  
           while(stop);        
     
           if (stop!=1)
             gtk_label_set_markup(GTK_LABEL(pApp->pConxState),"<span font_desc=\"Verdana 10\" foreground=\"#FF0000\">Chaine introuvable\n \tVeuillez recommencer</span>");          
     
          fclose(fichier);
          }

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while( (fgets(buffer,sizeof(buffer),fichier)!=NULL) )
    {                   
        /* si la chaine est egale a celle dans le buffer */
        if (strcmp(chaine_a_trouver,buffer)==0) 
        {
            /* Modification de l'état de connexion */
           gtk_label_set_text(GTK_LABEL(pApp->pConxState),chaine;                  
           stop=1;
           break;
       }         
    }
    Merci de m'aider . J'avais essayé avec un simple while exactement comme ca. Et le problème persistait quand meme . J'ai essayé ton code et il fait exactement comme décrit dans mon premier post .
    Apparement, le fgets dans le while puis la condition à la suite il n'aime pas beaucoup. Maintenant le probleme est différent. Il me trouve toutes les chaines meme s'elle qui ne sont pas dans le fichier.
    Une idée?

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par gespion Voir le message
    Merci de m'aider . J'avais essayé avec un simple while exactement comme ca. Et le problème persistait quand meme . J'ai essayé ton code et il fait exactement comme décrit dans mon premier post .
    Apparement, le fgets dans le while puis la condition à la suite il n'aime pas beaucoup. Maintenant le probleme est différent. Il me trouve toutes les chaines meme s'elle qui ne sont pas dans le fichier.
    Une idée?
    As tu vu la seconde partie de mon post, celle dans laquelle je supprime les '\n' ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    Citation Envoyé par mabu Voir le message
    As tu vu la seconde partie de mon post, celle dans laquelle je supprime les '\n' ?

    Ca marche impec. Re-merci! Peux tu m'expliquer le '\n';
    Est-ce que ca a un rapport avec le fait que les chaines soient de tailles variables et que fgets en mette un à la fin si la taille du buffer n'est pas atteinte?

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par gespion Voir le message

    Ca marche impec. Re-merci! Peux tu m'expliquer le '\n';
    Est-ce que ca a un rapport avec le fait que les chaines soient de tailles variables et que fgets en mette un à la fin si la taille du buffer n'est pas atteinte?
    Le '\n' marque une fin de ligne dans un fichier.

    Quand fgets lit une ligne, il laisse ce caractère puisse qu'il est présent dans le fichier.

    Tu pouvait correctement faire la comparaison sur la dernière ligne car elle n'était suivit d'un '\n' mais de la fin de fichier.

    Plus d'info dans les pages man. man fgets sur développez.

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

Discussions similaires

  1. [VBA-E] Récuperer une chaine de caractère dans un fichier pdf
    Par Alex_Kidd dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/07/2006, 15h01
  2. Réponses: 3
    Dernier message: 25/07/2006, 08h40
  3. Réponses: 4
    Dernier message: 18/07/2006, 16h31
  4. [VB]Recherche d'une chaine de caractère dans un fichier
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 26
    Dernier message: 16/02/2006, 09h10
  5. Ecriture d'une chaine de caractères dans un fichier
    Par fleur_de_rose dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 09h34

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