Langage C: recherche dans un fichier

tonguim -  
 brainniac1 -

Bonjour,

Je suis en train de réaliser un programme de "gestion des comptes bancaires" en langage C;

Dans le programme, j'ai une structure "compte" déclarée globalement.
 

struct compte
{
       char numeroCpte [11]; //numero du compte
       char typeCompte [7]; //type du compte: cheque ou epargne
       char nomClient [50]; //nom du client
       char prenomClient [50]; //prenom(s) du client
       char statutClient [12]; //statut social du client: salarie ou non salarie
       char categorieCompte [13]; //categorie du compte: particulier ou professionnel
       char numeroClient [11]; //numero du client
       char dateCreation [10]; //date de creation du compte
};

struct compte cpt; // declaration d'une variable cpt de type compte


J'enregistre les données dans la structure compte dans un fichier.

void EnregDansFichier ()
{
     char nomFichier [26]; //nom du fichier dans lequel il faut sauvegarder
     int erreur;
     int i;
     FILE *sortie;

     printf("Entrez le nom du fichier: ");
     scanf("%s",&nomFichier);
  
       sortie=fopen(nomFichier,"at");
 
       if (sortie == NULL)
       {
            printf("Un probleme est survenue lors de la tentative d'enregistrement de vos donnees dans le fichier %s\n",nomFichier);
       }
       else
       {
            fprintf(sortie,"%s \n %s \n %s \n %s \n %s \n %s \n %s \n %s \n", cpt.numeroCpte, cpt.typeCompte, cpt.nomClient, cpt.prenomClient, cpt.statutClient, cpt.categorieCompte, cpt.numeroClient, cpt.dateCreation);
       } 
       fclose(sortie);
}


Je voudrais effectuer une recherche à partir du nomClient, ou à partir du numeroCpte, dans le fichier, et afficher l'enregistrement correspondant:

void RechercheCpte ()
{
     char numeroCpte [11];
     char nomClient [50];
     char nomFichier [26];
     int trouve1, trouve2=0;
     FILE *sortie;
     
     printf ("Entrez le nom du fichier: "); scanf ("%s", nomFichier);
     sortie=fopen(nomFichier, "rt");
     
     printf ("\n\n\nEntrez le nom du client, ou le numero de compte que vous cherchez");
     printf ("\n\n\nNumero compte: "); scanf ("%s", numeroCpte);
     printf ("\n\n\nNom client: "); scanf ("%s", nomClient);
              
     while (!EOF) // tant que la fin du fichier n'est pas atteint
     {
         if (numeroCpte) // si un numero de compte a ete saisi
         {
             if (nomClient) // si un numero de compte et un nom de client ont ete saisi
             {
                trouve1=(strcmp(nomClient, cpt.nomClient));
             }
             else // si un numero de compte a ete saisi, mais pas de nom client
             {
                 trouve2=(strcmp(numeroCpte, cpt.numeroCpte));
             }
         }
         else // si aucun numero de compte n'a ete saisi
         {
             if (nomClient) // si aucun numero de compte n'a ete saisi, mais qu'un numero de client a ete saisie
             {
                trouve1=(strcmp(nomClient, cpt.nomClient));
             }
         }
     } // fin du while
    
    if (trouve1)
    {
         fscanf(sortie,"%s \n %s \n %s \n %s \n %s \n %s \n %s \n %s \n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation);
    }    
    system ("pause");
}


Mon programme ne marche pas. Il n'y a pas d'erreur lors de la compilation. Comment faut-il effectuer la recherche dans le fichier en question ?

Merci

A voir également:

6 réponses

tonguim
 

Merci Kiruasam pour ton aide.

J'ai refait la fonction rechercher ainsi:

void RechercheCpte ()
{
     char numeroCpte [11];
     char nomClient [50];
     char nomFichier [26];
     int trouve1, trouve2=0;
     FILE *sortie;
     
     printf ("Entrez le nom du fichier: "); scanf ("%s", nomFichier);
     sortie=fopen(nomFichier, "rt");
     
     printf ("\n\n\nEntrez le nom du client, ou le numero de compte que vous cherchez");
     printf ("\n\n\nNumero compte: "); scanf ("%s", numeroCpte);
     printf ("\n\n\nNom client: "); scanf ("%s", nomClient);
              
     while (!EOF || !trouve1 || !trouve2) // tant que la fin du fichier n'est pas atteint
     {
         if (numeroCpte) // si un numero de compte a ete saisi
         {
             if (nomClient) // si un numero de compte et un nom de client ont ete saisi
             {
                trouve1=(strcmp(nomClient, cpt.nomClient));
             }
             else // si un numero de compte a ete saisi, mais pas de nom client
             {
                 trouve2=(strcmp(numeroCpte, cpt.numeroCpte));
             }
         }
         else // si aucun numero de compte n'a ete saisi
         {
             if (nomClient) // si aucun numero de compte n'a ete saisi, mais qu'un numero de client a ete saisie
             {
                trouve1=(strcmp(nomClient, cpt.nomClient));
             }
         } // fin du if
         
         fscanf(sortie,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation);              
         
     } // fin du while
    
     fscanf(sortie,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation);
 
    system ("pause");
}


Il n'y a pas d'erreurs C, mais le programme ne marche toujours pas. Lorsque j'entre le nom que je cherche, et le numéro du compte, le programme plante. J'appuie sur la touche "entrée", mais il ne sort pas du while apparemment.
J'ai vraiment besoin, car ça fait plusieurs jours déjà que je suis bloqué à ce niveau.

4
tonguim
 
En fait dans la fonction recherche, j'ouvre le fichier, mais je ne sais pas comment le lire.
3
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 

Salutations,

Je me permets d'élaguer pour mieux voir (et aussi une bonne séparation interface utilisateur et coeur du programme c'est toujours plus sympa ^^) Je considère donc que la saisie est faite avant l'appel à la fonction de recherche et les critères passé en paramètres.
 

bool RechercheCpte ( char *pNomFichier, char *pNomClient, char *pNumeroCpte )
{
   bool bTrouve = false;
   FILE *sortie = 0;

   // Ouverture du fichier
   sortie = fopen(nomFichier, "rt");
   
   // test de l'ouverture
   if ( sortie == 0 )
      return false;

   // On se débarrasse des pointeur nuls ici pour alléger le reste plus loin...
   if ( pNomClient == 0 )
      pNomClient = "";

   if ( pNumeroClient == 0 )
      pNumeroClient = "";
   
   // Recherche

   while ( fread( &cpt, sizeof( struct compte ), 1, sortie ) )
   {
      if ( ( strcmp( pNomClient, cpt.nomClient ) == 0 ) ||
            ( strcmp( pNuméroClient, cpt.numeroClient ) == 0 ) )
      {
         bTrouve = true;
         break;
      }
   }

   // fermeture du fichier
   fclose( sortie );
   
   // Réponse
   return bTrouve;
}


J'ai pas de compilo sous la main mais ça me parait bien comme cela...

On pourra pour une sortie plus détaillée mettre un code de retour plutôt qu'un simple booléen.

M.

Edit.: J'ai aussi supposé que les compte enregistré dans le fichier avait leur numéro et nom de client différents de "".



Whoops, j'avais pas que que ce sujet était de l'an dernier ^^"

2
brainniac1
 
Salut,
J'ai lu votre ajout sur la recherche dans un fichier, et en fait, j'ai exactement ce probleme. Bon, la je viens de debuter dans la ce domaine et je dois faire un dictionnaire dans lequel je dois faire la recherche d'un mot dans un fichier. Bon, je pense pouvoir utiliser une structure pour le faire. mais bof, je me perd. Donc, j'ai le mot et la definition dans le meme fichier. Ouvrir lire et afficher le fichier je peux le faire, mais touver le mot et la definition, la je n'arrive pas.. Je peux compter le nombre de lignes dans le fichier, dois je voir le fichier comme un gros tableau? Et la comparaison je le fais comment?
Merci, d'avance!!! Ca m'aiderai bcp d'avoir une reponse.
0
kiruasam Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   3
 

1 - Tu ne lis pas dans le fichier quand tu fais tes comparaisons

  •  déclare une variable ou tu vas stocker le nom de client lu.
  • idem pour le numéro de compte.
  • ensuite ajoute fscanf("%s\n, nomclient); avant de faire tes comparaisons avec strcmp


2 - Tu dois rajouter un test a ta boucle while pour sortir de la boucle dès qu'un numéro de compte ou un nom de client est trouvé dans le fichier. Sinon la valeur de tes variables trouve1 et trouve2 correspondront toujours au dernier champ de ton fichier (en l'occurrence ici le champ dateCreation de ton dernier enregistrement) :

while ((!EOF) || (!trouve1) || (!trouve2))
{
     ...
}


3 - Même si tu trouves ce que tu veux dans le fichier, ton fscanf ne va pas lire les bonnes valeurs dans ton fichier car ton pointeur de fichier se trouvera a la fin du champ (numéro de compte ou nomClient) que tu viendra de trouver.

Et là j'ai pas le temps de t'aider plus, désolé, je repasserais


1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kiruasam Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   3
 

Finalement j'ai un peu de temps ...

Évite les espaces dans ton fprintf de ta fonction EnregDansFichier, ça c'est mieux :

fprintf(sortie,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",...); 


Le mieux pour résoudre les problèmes 1 et 3 c'est de déclarer un compte :

cpt compt;


Et que tu lises ton fichier compte par compte, c'est a dire que dans ton while tu auras :

fscanf(
  sortie,
  "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
  &compt.numeroCpte,
  &compt.typeCompte,
  &compt.nomClient,
  &compt.prenomClient,
  &compt.statutClient,
  &compt.categorieCompte,
  &compt.numeroClient,
  &compt.dateCreation
);


Comme ça tu n'a plus de problème avec le placement du pointeur dans ton fichier et ta structure est deja remplie quand tu sors de la boucle :)


1
kiruasam Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   3
 

Je te conseillerais un autre mode pour la saisie de l'utilisateur parce que la avec le scanf il est dans tout les cas obligé de renseigner un numéro de compte et un nom (tapez entrée tout seul ce n'est pas possible).
Sinon j'ai testé ça qui fonctionne pour la recherche par numéro de compte mais c'est loin d'être parfait :

int RechercheCpte ()
{
     char numeroCpte [11];
     char nomClient [50];
     char nomFichier [26];
     int trouve1=1, trouve2=1;
     FILE *sortie;

     printf ("Entrez le nom du fichier: ");
     scanf ("%s", nomFichier);
     sortie=fopen(nomFichier, "rt");

     printf ("\n\n\nEntrez le nom du client, ou le numero de compte que vous cherchez");
     printf ("\n\n\nNumero compte: "); scanf ("%s", numeroCpte);
     printf ("\n\n\nNom client: "); scanf ("%s", nomClient);

     while (fscanf(sortie,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation)!=EOF) // tant que la fin du fichier n'est pas atteint
     {
         if (numeroCpte) // si un numero de compte a ete saisi
         {
         	trouve2=(strcmp(numeroCpte, cpt.numeroCpte));
         }
         if (trouve2!=0) // si compte pas trouver avec le numero de compte
             if (nomClient) // si aucun numero de compte n'a ete saisi, mais qu'un numero de client a ete saisie
             {
                trouve1=(strcmp(nomClient, cpt.nomClient));
             }

     // si on a trouve on sort du while
     if (trouve1==0 || trouve2==0) break;
     } // fin du while

    system ("pause");
    if (trouve1==0 || trouve2==0)	return 0;
    else			return 1;
}

int main() {

 if ( RechercheCpte() == 0)
	 printf("Resultat :\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation);
 else
	printf("Erreur de recherche : le compte n'existe pas ou erreur de saisie");

 return 0;
}

1