Langage C: recherche dans un fichier
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
- Les fichiers en langage c
- Renommer des fichiers en masse - Guide
- Fichiers epub - Guide
- Wetransfer gratuit fichiers lourd - Guide
- Explorateur de fichiers - Guide
- Supprimer les fichiers temporaires - Guide
6 réponses
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.
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 ^^"
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.
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionFinalement 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 :)
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; }