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 :

fonction de comparaison de string entre deux fichiers


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 59
    Par défaut fonction de comparaison de string entre deux fichiers
    Bonjour tout le monde!

    J'ai un problème avec un programme, ce dernier doit ouvrir deux fichiers .txt; une liste de membres et une liste de présence. Il fait appel à une fonction qui recherche le nom du membre dans la liste de présence, si le nom est dedans, il passe au membre suivant, si il ne l'est pas, il s'affiche à l'écran et le programme recommence l'analyse avec le membre suivant.

    Le problème est que mon programme affiche le premier nom qui ne se trouve pas dans les deux listes et c'est tout, je pense (je suis quasi sûr, à vrai dire) que ça vient de ma condition de boucle mais je ne vois pas comment fixer le problème :/

    Une condition totalement différente? Une condition supplémentaire? une autre boucle? ...

    Je précise que je ne suis pas expert en programmation et la manipulation de fichiers est un sujet encore assez flou pour moi, je ne suis qu'étudiant et je n'ai pas vu cette matière...

    Voici mon programme :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LIM 15
     
    void searchName(char*, char*, FILE*, FILE*);
     
    int main()
    {
        char name[LIM];
        char nom[LIM];
        FILE* listeMembres=NULL;
        FILE* listePresences=NULL;
     
        listeMembres = fopen("listeMembres.txt","r");
        listePresences = fopen("listePresences.txt","r");
     
        if(listeMembres != NULL && listePresences != NULL)
        {
            searchName(name, nom, listePresences, listeMembres);
        }
        else
        {
            printf("Impossible d'ouvrir le fichier listeMembres.txt");
        }
        fclose(listeMembres);
        fclose(listePresences);
     
        return 0;
    }
     
    void searchName(char *name,char *nom, FILE *listePresences, FILE* listeMembres)
    {
        fgets(name, LIM, listeMembres);
        fgets(nom, LIM, listePresences);
     
        while(feof(listePresences)==0)
        {
            if(strcmp(name,nom)==0)
            {
                fgets(name, LIM, listeMembres);
                rewind(listePresences);
            }
            else
            {
                fgets(nom, LIM, listePresences);
                if(feof(listePresences))
                {
                    printf("%s",name);
                }
            }
        }
    }
     
     
    /*
    Problèmes :
     
    1. Affiche le premier absent et pas toute la liste d'absents (condition de boucle?)
    2. affiche le dernier nom présent au lieu des absents à partir d'un certain palier
    */
    Toutes informations pouvant aider à régler le problème sont les bienvenues
    Merci d'avance!

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Dans ces cas-là, il ne faut pas hésiter à laisser tomber son clavier (au sens figuré, hein?) et à griffonner un peu de pseudo-code. Pour l'instant tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Tant qu'il y a des noms dans la liste de présence:
      Si c'est le nom du membre:
        Alors on prend le prochain membre et on revient au début de la liste de présence
      Sinon:
        On prend le prochain présent et s'il n'y en a plus on affiche le nom du membre
    Donc mettons qu'on soit à la fin de liste de présence et qu'on ait pas trouvé le nom (ligne 6). Que se passe-t-il? On revient au début de la boucle qui nous dit: si je n'ai plus de nom dans la liste de présence, c'est fini. Du coup, eh bien, c'est fini -après le premier nom si le deuxième n'est pas dans la liste de présence.

    Je dirais qu'il te faut plutôt une double boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Tant qu'il y a des membres:
      trouvé = faux
      Tant qu'il y a des présents:
         si membre = présent: alors trouvé = vrai et break
      si trouvé = faux: print membre
      rewind presents

  3. #3
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    J'ajouterais que si faire la recherche dans le fichier lui-même n'est pas une contrainte de l'énoncé, alors lis tes fichiers d'une traite, stockes leur contenu en mémoire (au moins la liste de présence) puis effectues les opérations de recherche sur tes structure de données. Tu auras ainsi une idée plus claire de ce que tu fais, je pense.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 59
    Par défaut
    voici ce que j'ai maintenant comme code :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LIM 15
     
    void searchName(char*, char*, FILE*, FILE*);
     
    int main()
    {
        char name[LIM];
        char nom[LIM];
        FILE* listeMembres=NULL;
        FILE* listePresences=NULL;
     
        listeMembres = fopen("listeMembres.txt","r");
        listePresences = fopen("listePresences.txt","r");
     
        if(listeMembres != NULL && listePresences != NULL)
        {
            searchName(name, nom, listePresences, listeMembres);
        }
        else
        {
            printf("Impossible d'ouvrir le fichier listeMembres.txt");
        }
        fclose(listeMembres);
        fclose(listePresences);
     
        return 0;
    }
     
    void searchName(char *name,char *nom, FILE *listePresences, FILE* listeMembres)
    {
        int find=0;
        fgets(name, LIM, listeMembres);
        fgets(nom, LIM, listePresences);
     
        while(feof(listeMembres)==0)
        {
            find=0;
            while(feof(listePresences)==0)
            {
                if(name==nom)
                {
                    find=1;
                    break;
                }
            }
            if(find==0)
            {
                printf("%s",name);
            }
            rewind(listePresences);
        }
    }
    Sauf que la console reste désespérément vide... elle ne m'affiche plus rien, comme si elle était en travail... sauf qu'elle ne fait rien :/
    Il y a juste le curseur dans la console, pas de return, pas de nom, rien...

  5. #5
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Relis bien tes conditions de boucle, notamment celles de la boucle interne. Il n'y a rien dans le corps de la boucle qui fait évoluer ces conditions (que ce soit celle sur la fin de fichier ou la comparaison de chaines). Donc si ces conditions deviennent vraies avant ou pendant l'exécution de ta boucle, elles le resteront à jamais quoiqu'il arrive. Tu as donc ici un problème algorithmique à résoudre.

    En parlant de la comparaison de chaînes : name==nom n'effectue pas l'opération que tu attends. Cela fonctionne en Python, Java, C#... mais pas en C. Regarde du côté de strcmp.

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Tu as oublié tes fgets

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/05/2015, 10h41
  2. comparaison valeurs entre deux fichiers texte
    Par seb-65 dans le forum Langage
    Réponses: 8
    Dernier message: 18/12/2013, 13h46
  3. [XL-2010] Comparaison de formule entre deux fichiers excel
    Par africanism95 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/04/2013, 15h59
  4. [Débutant] Comparaisons entre deux fichiers textes
    Par shootgirl dans le forum MATLAB
    Réponses: 9
    Dernier message: 27/09/2011, 14h50
  5. Réponses: 22
    Dernier message: 25/02/2009, 09h11

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