Fichiers & structures & String - Fonction de recherche

Fichiers & structures & String - Fonction de recherche - C - Programmation

Marsh Posté le 11-04-2012 à 22:07:10    

Hello :)
Je souhaite savoir comment mettre en place une fonction de recherche d'une chaîne de caractères (String) dans un fichier. Sachant que cette chaîne fait partie d'une structure.

 

Je m'explique. J'ai le code suivant qui me permet de remplir un fichier de villes desservies. Pour ne pas trop alourdir mon post, je laisse de côté le bout de code pour vérifier que le fichier existe

 
Code :
  1. FILE *entree;
  2. struct desserte {
  3.  char ville[40];
  4.  char gare[40];
  5.  };
  6. struct desserte escale;
  7. strcpy(escale.ville, "1" );
  8. entree = fopen("liste_villes", "a" );
  9. while(strcmp(escale.ville,"ZZ" ) != 0)
  10. {
  11.  printf("Entrer une ville en majuscules (ZZ pour terminer): " );
  12.  scanf("%s", escale.ville);
  13.  if(strcmp(escale.ville,"ZZ" ) != 0)
  14.  {
  15.  fprintf(entree, "%s\n", escale.ville);
  16.  printf("Entrer la gare correspondante en majuscules: " );
  17.  scanf("%s", escale.gare);
  18.  fprintf(entree, "%s\n", escale.gare);
  19.  }
  20. }
  21. fclose(entree);
  22. }


Je souhaite mettre en place un programme qui permet de saisir l'ensemble des trains desservant une gare à un moment donné.

 
Code :
  1. int verifgare();
  2. main()
  3. {
  4. struct train {
  5.                 int num_train;
  6.                 char gare_dep[30];
  7.                 // Je n'ai pas mis tous les champs pour simplifier
  8.                 };
  9. struct train voyage;
  10. int resultat;
  11. FILE *f1;
  12. f1 = fopen("liste_vols", "a" );
  13.         voyage.num_train = -1; 
  14.         while(voyage.num_vol != 0)
  15.         {
  16.              printf("Entrer un numéro de train (0 pour arrêter la saisie) : " );
  17.              scanf("%d", &voyage.num_train);
  18.  
  19.              if(voyage.num_train != 0)
  20.              {
  21.                   printf("Saisir la ville de départ : " );
  22.                   scanf("%s", voyage.gare_dep);
  23.                   resultat = verifgare(voyage.gare_dep); 
  24.                   if (resultat == 0)
  25.                   {
  26.                  printf("La gare saisie n'est pas valide.\n" );
  27.                         fclose(entree);
  28.                   }
  29.                   else
  30.                  {
  31.                         // On sauvegarde dans le fichier.
  32.                         fprintf(f1, "%d %s\n", voyage.num_train, voyage.gare_dep);
  33.                  }
  34.             }
  35.         }
  36. fclose(f1);
  37. }
  38. int verifgare(char gare[30])
  39. {
  40.   FILE *f2;
  41.   f2= fopen("liste_villes","r" );
  42.   int trouve = 0;
  43.   char temp[30] ; // Ligne lue dans fichier liste_villes
  44.   strcpy(temp, "" );
  45.   while (!EOF && trouve == 0)
  46.    {
  47.    fgets(temp, 29, f2);
  48.    if((strcmp(temp, gare)) == 0)
  49.    {
  50.     trouve = 1;
  51.     return 1;
  52.    }
  53.   }
  54.   return 0;
  55.           fclose(f2);
  56. }
 

ça ne marche pas. J'obtiens toujours le message "La gare saisie n'est pas valide" bien que je saisie des gares renseignées dans le fichier.

 

Pouvez-vous m'aider s'il vous plaît :-( ?


Message édité par bhah1 le 12-04-2012 à 09:36:44
Reply

Marsh Posté le 11-04-2012 à 22:07:10   

Reply

Marsh Posté le 11-04-2012 à 23:37:29    

ligne 65: aero?
Sinon ton code est très mauvais...
Tu devrais reprendre les cours du début...


---------------
Seul Google le sait...
Reply

Marsh Posté le 12-04-2012 à 09:23:03    

Alors si tu veux, ta réponse n'est pas très constructive...
Si j'ai posté sur le forum, c'est justement pour demander de l'aide et apprendre de mes erreurs.
Ceci dit, bien vu, c'est gare et non pas aero à la ligne 65 :).

Reply

Marsh Posté le 14-04-2012 à 11:54:31    

Le principal problème est dans ta fonction verifgare, ligne 56: !EOF vaut toujours zéro, tu ne rentre donc jamais dans ta boucle.
 
Tu auras ensuite deux autres problèmes:
 
1. La chaine obtenue après fgets est terminée par un saut de ligne -> tu auras donc "PARIS\n" et "PARIS" et le strcmp ne pourra pas fonctionner
2. Tu ne vérifies pas le retour de fgets. Tu devrais sortir de la boucle et retourner 0 si fgets renvoie NULL (même si usuellement, en C on renvoit 0 si tout s'est bien passé et -1 ou une autre valeur négative en cas d'échec).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed