Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Langage C: recherche dans un fichier

tonguim, le vendredi 7 avril 2006 à 15:44:52
Bonjour,

je suis en train de realiser un programme de "gestion des comptes bancaires" en langage C;

Dans le programme, j'ai une structure compte declarée comme une variable globale:

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 donnees 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'ya pas d'erreur lors de la compilation. Comment faut il effectuer la recherche dans le fichier en question? Merci
Répondre à tonguim  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
tonguim, le vendredi 7 avril 2006 à 16:40:32
En fait dans la fonction recherche, j'ouvre le fichier, mais je ne sais pas comment le lire.
Répondre à tonguim

2


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
kiruasam, le vendredi 7 avril 2006 à 16:41:26
1 - Tu ne lis pas dans le fichier quand tu fais tes comparaisons
declare une variable ou tu vas stocker le nom de client lu.
idem pr le numero 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 numero 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'occurence ici le champ dateCreation de ton dernier enregistrement) :
while ((!EOF) || (!trouve1) || (!trouve2))
{
     ...
}

3 - meme 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 (numero de compte ou nomClient) que tu viendra de trouver.

Et la j'ai pas le temps de t'aider plus, dsl, je repasserais Moi je dis ça...je dis rien ^^
Répondre à kiruasam

3


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
kiruasam, le vendredi 7 avril 2006 à 16:56:47
Finalement j'ai un peu de temps ...

Evite 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 problemes 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 :) Moi je dis ça...je dis rien ^^
Répondre à kiruasam

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
tonguim, le dimanche 9 avril 2006 à 12:42:56
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'ya pas d'erreurs C, mais le programme ne marche toujours pas; lorsque j'entre le nom que je cherche, et le numero du compte, le programme se 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.
Répondre à tonguim

5


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
kiruasam, le lundi 10 avril 2006 à 15:06:41
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 numero 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 numero de compte mais c'est loin d'etre 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;
}

Moi je dis ça...je dis rien ^^
Répondre à kiruasam

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
mounji, le dimanche 13 janvier 2008 à 16:21:15
ki veux me parlé un peux sur le piratage je suis pret lol i swear mon surnom"HaCkEr-_-MaN"
Répondre à mounji

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
djheart, le dimanche 20 janvier 2008 à 20:23:49
Post en mode IGNORED !

mounji

Tu devrais jeter un coup d'oeil la charte du site.
Et pour ton information, Hacker c'est mal et toi même tu peux faire l'objet d'un Hack tu trouveras ca moins rigolo !
Répondre à djheart

8


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Mahmah, le dimanche 20 janvier 2008 à 21:04:41
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 ^^"
Répondre à Mahmah

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
brainniac1, le mardi 5 février 2008 à 01:39:17
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.
Répondre à brainniac1

10


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
pghm77, le jeudi 5 juin 2008 à 15:42:46
bonjour,
j'aurais voulus savoir si une recherche du genre pouvais fonctionner pour mon probleme.
l'utilisateur doit rentrer des mots clefs pour afficher un rapport.
chaque rapport est dans un fichier.txt
les mots clefs ont une place présise dans chaque rapport. ( ligne 5, 6, 7)
j'aimerai savoir s'il est possible de parcourir tout les fichiers d'un dossier pour vérifier les mots clefs et si ces mots clefs corresponde a ce rentré par l'utilisateur il m'affiche le titre du fichier (qui est lui aussi dans fichier a la ligne 9).

merci d'avance de vos réponses.
cordialement
Répondre à pghm77

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 naruto, le lundi 10 novembre 2008 à 23:07:17
bonjour tt le monde
d'abord cette if else n'a pas de sens :
if (sortie == NULL)
{
printf("Un probleme est survenue lors de la tentative d'enregistrement de vos donnees dans le fichier %s\n",nomFichier);
}
else
{
puis t'a un gros prob en fait jamais la saisie d'une chaine de caractere de cette façon:
scanf("%s",&nomFichier);
le & ne doit pa etre la ou bien utulise <gets> et c'est mieux
3)pourquoi ces declarations
char numeroCpte [11];
char nomClient [50];
char nomFichier [26];
tu as deja declarer la structure globale
Répondre à naruto

Résultats pour langage C: recherche dans un fichier

Recherche dichotomique en C dans fichier (Résolu) Bonjour, j'ai un petit problème en langage C... Je cherche à faire une recherche dans un fichier contenant un dictionnaire, c'et pour un programme de scrabble... Dnc j'ai besoin de faire une recherche dichotomique dans mon fichier pour... www.commentcamarche.net/forum/affich-341051-recherche-dichotomique-en-c-dans-fichier
Comment créer des fichier text en languag c?? (Résolu) bonjours à tous le mondes et bonne annéeeeee!!! Voilà mon problème, tout d'abord j'arrive à créer les fichier txt avec leur noms, exemple: 1.txt 2.txt 3.txt.... mais je n'arrive pas à les remplir avec un contenu différent dans chaqun,... www.commentcamarche.net/forum/affich-2608536-comment-creer-des-fichier-text-en-languag-c
Petit programme en langage C (Résolu) Bonjour, Etantdonné débutant en langage C, permettez moi S.V.P de vous adresser mon petit probléme que je n'arrive à comprendre la réponse: l'ennoncé de l'exercie: Écrire une fonction qui ne renvoie aucune valeur et qui détermine la... www.commentcamarche.net/forum/affich-2811312-petit-programme-en-langage-c

Résultats pour langage C: recherche dans un fichier

Convertir un fichier WAV, AVI, MPEG vers le format 3GP / 3GPPPour convertir un fichier WAV, AVI, MPEG ou MP3 au format 3GP, il suffit d'utiliser l'un des logiciels suivants : Mobile 3GP Converter MediaCoder Super On peut aussi utiliser un convertisseur en ligne tel que : Media Convert www.commentcamarche.net/faq/sujet-2470-convertir-un-fichier-wav-avi-mpeg-vers-le-format-3gp-3gpp
Créer un fichier Autorun.infCréation de fichier autorun Autoriser l'exécution automatique Création du fichier autorun.inf Personnaliser l'icône Personnaliser le texte Personnaliser le menu Autoriser l'exécution automatique Une fonctionnalité de Windows... www.commentcamarche.net/faq/sujet-12609-creer-un-fichier-autorun-inf
[Shell] Créer un fichier videPour créer un fichier vide, il vous suffit de taper la commande suivante : > fichier Vous pouvez également utiliser la commande touch : touch fichier www.commentcamarche.net/faq/sujet-866-shell-creer-un-fichier-vide

Résultats pour langage C: recherche dans un fichier

Langage c: déplacement dans un répertoire (Résolu)Bonjour à tous, J'essaye de faire une barre de progression en langage C (un peu comme dans le poste de travail quand on copie des fichiers). Mais j'ai un petit soucis: comment faire pour connaitre la taille d'un répertoire (je suppose... www.commentcamarche.net/forum/affich-1702007-langage-c-deplacement-dans-un-repertoire
Conversion un fichier .hex en .c (Résolu)Bonjour, Voila j'aimerai connaitre un moyen simple de convertir la totalité d'un fichier en hexadecimal en langage C. Ou si cela n'est pas possible convertir de l'hexadecimal en ASCII. Par avance merci de vos réponse. www.commentcamarche.net/forum/affich-5375940-conversion-un-fichier-hex-en-c
Exec en langage C (Résolu)Bonjour à tous. J'écris un programme en langage C permettant de créer un fichier de config (pour MRTG). Pour cela je dois utiliser la primitive "exec", la commande que je souhaite lancer ressemble à : snmpgetnext -c community IPadress OID.... www.commentcamarche.net/forum/affich-1623603-exec-en-langage-c

Résultats pour langage C: recherche dans un fichier

Caractéristiques du langage C++Le fichier source Le fichier source d'un programme écrit en langage C++ est un simple fichier texte dont l'extension est par convention .CPP. Ce fichier source doit être un fichier texte non formaté, c'est-à-dire un fichier texte dans sa plus... www.commentcamarche.net/contents/cpp/cppcarac.php3
Caractéristiques du langage CLe fichier source Le fichier source d'un programme écrit en langage C est un simple fichier texte dont l'extension est par convention .c. Note d'un visiteur (J.Grondin) : L'extension est en minuscules. Le .C (majuscule) est interprété par... www.commentcamarche.net/contents/c/ccarac.php3
Langage C - Les chaînes de caractèresQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne... www.commentcamarche.net/contents/c/cstring.php3