Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment :
Cdiscount : -30€ dès 300€ ...
Voir le deal

Fichiers & structures & String - Fonction de recherche

2 participants

Aller en bas

Fichiers & structures & String - Fonction de recherche Empty Fichiers & structures & String - Fonction de recherche

Message  eurydice Mer 11 Avr 2012 - 23:01

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:

FILE *entree;
struct desserte {
      char ville[40];
      char gare[40];
      };
 
struct desserte escale;
 
strcpy(escale.ville, "1");
 
entree = fopen("liste_villes", "a");
 
   while(strcmp(escale.ville,"ZZ") != 0)
   {
      printf("Entrer une ville en majuscules (ZZ pour terminer): ");
      scanf("%s", escale.ville);
 
      if(strcmp(escale.ville,"ZZ") != 0)
      {
      fprintf(entree, "%s\n", escale.ville);
 
      printf("Entrer la gare correspondante en majuscules: ");
      scanf("%s", escale.gare);
      fprintf(entree, "%s\n", escale.gare);
      }
   }
fclose(entree);
}
Je souhaite mettre en place un programme qui permet de saisir l'ensemble des trains desservant une gare à un moment donné.

Code:

int verifgare();
 
main()
{
struct train {
              int num_train;
              char gare_dep[30];
              // Je n'ai pas mis tous les champs pour simplifier
            };
 
struct train voyage;
int resultat;
 
FILE *f1;
 
f1 = fopen("liste_vols", "a");
 
        voyage.num_train = -1; 
        while(voyage.num_vol != 0)
        {
            printf("Entrer un numéro de train (0 pour arrêter la saisie) : ");
            scanf("%d", &voyage.num_train);
 
            if(voyage.num_train != 0)
            {
                printf("Saisir la ville de départ : ");
                scanf("%s", voyage.gare_dep);
                resultat = verifgare(voyage.gare_dep); 
 
                if (resultat == 0)
                {
                   printf("La gare saisie n'est pas valide.\n");
                        fclose(entree);
                }
                else
                {
                        // On sauvegarde dans le fichier.
                        fprintf(f1, "%d %s\n", voyage.num_train, voyage.gare_dep);
                }
          }
      }
fclose(f1);
}
 
int verifgare(char gare[30])
 
{
  FILE *f2;
 
  f2= fopen("liste_villes","r");
  int trouve = 0;
  char temp[30] ; // Ligne lue dans fichier liste_villes
  strcpy(temp, "");
 
     while (!EOF && trouve == 0)
      {
        fgets(temp, 29, f2);

         if((strcmp(temp, gare) == 0)
        {
           trouve = 1;
           return 1;
        }
     }
     return 0;   
          fclose(f2);
 }
ç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 ?

eurydice

Messages : 1
Date d'inscription : 11/04/2012

Revenir en haut Aller en bas

Fichiers & structures & String - Fonction de recherche Empty Re: Fichiers & structures & String - Fonction de recherche

Message  -ed- Lun 1 Sep 2014 - 3:32

eurydice a écrit: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:

FILE *entree;
struct desserte {
      char ville[40];
      char gare[40];
      };
 
struct desserte escale;
 
strcpy(escale.ville, "1");
 
entree = fopen("liste_villes", "a");
 
   while(strcmp(escale.ville,"ZZ") != 0)
   {
      printf("Entrer une ville en majuscules (ZZ pour terminer): ");
      scanf("%s", escale.ville);
 
      if(strcmp(escale.ville,"ZZ") != 0)
      {
      fprintf(entree, "%s\n", escale.ville);
 
      printf("Entrer la gare correspondante en majuscules: ");
      scanf("%s", escale.gare);
      fprintf(entree, "%s\n", escale.gare);
      }
   }
fclose(entree);
}
Je souhaite mettre en place un programme qui permet de saisir l'ensemble des trains desservant une gare à un moment donné.

Code:

int verifgare();
 
main()
{
struct train {
              int num_train;
              char gare_dep[30];
              // Je n'ai pas mis tous les champs pour simplifier
             };
 
struct train voyage;
int resultat;
 
FILE *f1;
 
f1 = fopen("liste_vols", "a");
 
        voyage.num_train = -1;  
        while(voyage.num_vol != 0)
        {
             printf("Entrer un numéro de train (0 pour arrêter la saisie) : ");
             scanf("%d", &voyage.num_train);
 
             if(voyage.num_train != 0)
             {
                 printf("Saisir la ville de départ : ");
                 scanf("%s", voyage.gare_dep);
                 resultat = verifgare(voyage.gare_dep);  
 
                 if (resultat == 0)
                 {
                   printf("La gare saisie n'est pas valide.\n");
                         fclose(entree);
                 }
                else
                {
                        // On sauvegarde dans le fichier.
                        fprintf(f1, "%d %s\n", voyage.num_train, voyage.gare_dep);
                }
          }
      }
fclose(f1);
}
 
int verifgare(char gare[30])
 
{
  FILE *f2;
 
  f2= fopen("liste_villes","r");
  int trouve = 0;
  char temp[30] ; // Ligne lue dans fichier liste_villes
  strcpy(temp, "");
 
     while (!EOF && trouve == 0)
      {
        fgets(temp, 29, f2);

         if((strcmp(temp, gare) == 0)
        {
           trouve = 1;
           return 1;
        }
     }
     return 0;   
          fclose(f2);
 }
ç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 ?
Code:
     while (!EOF && trouve == 0)
EOF est une macro qui a une valeur constante ... Ce n'est probablement pas ce que tu cherches ...
Code:

     return 0;   
          fclose(f2);
Il ne doit pas y avoir d'instruction après un return. Elle ne seront jamais exécutées ...

Attention, fgets() lit une ligne complète AVEC la fin de ligne. Avant la comparaison, il convient donc de le retirer selon la technique bien connue du search and destroy. Des réponses ici :

http://www.bien-programmer.fr/notes.php#fichiers

C'est un problème classique de gestion des entrées en C par stdio qui doit être faite de manière beaucoup plus rigoureuse ...
Code:
scanf("%s", voyage.gare_dep);
est totalement interdit ... (pas de contrôle de la longueur saisie ...)

http://www.bien-programmer.fr/notes.php#saisie
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser