[C] Recuperation des données à partir d'un fichier !

Recuperation des données à partir d'un fichier ! [C] - C++ - Programmation

Marsh Posté le 16-10-2002 à 18:06:48    

je refait un petit post histoire de bien remettre mes idées au plat pour etre bien compris...
 
voila j'ai cette structure
 

Code :
  1. struct sclient
  2. {
  3.   int numCli;
  4.   char nomCli[40];
  5.   char adresseCli[50];
  6.   char villeCli[20];
  7.   int cpCli;
  8.   char telCli[10];
  9. }client;

 
a un moment dans mon programme je demande a l'utilisateur de saisir le numero client
 

Code :
  1. void fclientMAJ(void)
  2. {
  3.   int b,numRepC,rep,cp;
  4.   char nom[40],adr[50],vil[20],tel[10];
  5.   FILE *fclient;
  6.   if((fclient=fopen("client.dat","a" ))==NULL)
  7.     {
  8.       puts("Erreur" );
  9.       getch();
  10.     }
  11.     else
  12.     {
  13.     do
  14.     {
  15.       clrscr();
  16.       puts("Numero de client:" );
  17.       scanf("%d",&b);
  18.       numRepC=fverifNumCli(b);
  19.       if(numRepC==-1)
  20.         {
  21.           puts("Une erreure c'est produite..." );
  22.           rep='n';
  23.           getch();
  24.         }
  25.         else if (numRepC==0)
  26.         {
  27.           flushall();
  28.           client.numCli=b;

 
donc on peut voir que je fais appel a une fonction, la voici :
 

Code :
  1. int fverifNumCli(int sNumCli)
  2. {
  3.   FILE *fclient;
  4.   int repv;
  5.   if ((fclient=fopen("client.dat","r" ))==NULL)
  6.     repv=-1;
  7.     else
  8.     {
  9.       do
  10.       {
  11.         if(client.numCli==sNumCli)
  12.           repv=1;
  13.             else
  14.               repv=0;
  15.       }
  16.       while (fread(&client,sizeof(struct sclient),1,fclient),!feof(fclient));
  17.     }
  18. return repv;
  19. }

 
tout se passe bien, j'aimerais simplement qu'en plus de dire si ce numCli existe deja qu'il me renvoi la derniere valeur (en somme la plus haute valeur) de numCli comme ca l'utilisateur s'il ne sais pas quel est le numCli le plus grand n'auras pas à essayé jusqu'a temps de trouver le bon numCli....

Reply

Marsh Posté le 16-10-2002 à 18:06:48   

Reply

Marsh Posté le 16-10-2002 à 18:21:33    

Dite moi ce que vous en pensez (certe j'y arrive mais pas comme je le pensais au depart...)
 

Code :
  1. void fclientMAJ(void)
  2. {
  3.   int b,numRepC,rep,cp;
  4.   char nom[40],adr[50],vil[20],tel[10];
  5.   FILE *fclient;
  6.   if((fclient=fopen("client.dat","a" ))==NULL)
  7.     {
  8.       puts("Erreur" );
  9.       getch();
  10.     }
  11.     else
  12.     {
  13.     do
  14.     {
  15.       clrscr();
  16.       puts("Numero de client:" );
  17.       scanf("%d",&b);
  18.       numRepC=fverifNumCli(b);
  19.       if(numRepC==-1)
  20.         {
  21.           puts("Une erreure c'est produite..." );
  22.           rep='n';
  23.           getch();
  24.         }
  25.         else if (numRepC==0)
  26.         {
  27.           flushall();
  28.           client.numCli=b;
  29.           puts("Nom client:" );
  30.           scanf("%[^\n]",&nom);
  31.           strncpy(client.nomCli,nom,40);
  32.           flushall();
  33.           puts("Adresse:" );
  34.           scanf("%[^\n]",&adr);
  35.           strncpy(client.adresseCli,adr,50);
  36.           flushall();
  37.           puts("Ville :" );
  38.           scanf("%[^\n]",&vil);
  39.           strncpy(client.villeCli,vil,20);
  40.           flushall();
  41.           puts("Code postal :" );
  42.           scanf("%d",&cp);
  43.           client.cpCli=cp;
  44.           flushall();
  45.           puts("Telephone :" );
  46.           scanf("%s",&tel);
  47.           strncpy(client.telCli,tel,10);
  48.           fwrite(&client,sizeof(struct sclient),1,fclient);
  49.           flushall();
  50.           puts("Desirez vous poursuivre les enregistrements? o/n" );
  51.           scanf("%c",&rep);
  52.         }
  53.         else
  54.         {
  55.           puts("Ce numero client existe deja...\n" );
  56.           printf("Le prochain numero client est : %d\n",(numRepC+1));
  57.           //pouvoir ecrire quel est le prochain Numero clients dispo...
  58.           puts("Desirez vous poursuivre les enregistrements? o/n" );
  59.           scanf("%c",&rep);
  60.           getch();
  61.         }
  62.     }while(rep=='o');
  63.     }
  64.   fclose(fclient);
  65.   fmenuClient();
  66. }

 
 

Code :
  1. int fverifNumCli(int sNumCli)
  2. {
  3.   FILE *fclient;
  4.   int repv,max;
  5.   max=0;
  6.   if ((fclient=fopen("client.dat","r" ))==NULL)
  7.     repv=-1;
  8.     else
  9.     {
  10.       do
  11.       {
  12.         if(client.numCli==sNumCli)
  13.           do
  14.           {
  15.             if(client.numCli>max)
  16.             {
  17.               max=client.numCli;
  18.               repv=max;
  19.             }
  20.           }
  21.           while (fread(&client,sizeof(struct sclient),1,fclient),!feof(fclient));
  22.             else
  23.               repv=0;
  24.       }
  25.       while (fread(&client,sizeof(struct sclient),1,fclient),!feof(fclient));
  26.     }
  27. return repv;
  28. }

Reply

Marsh Posté le 21-10-2002 à 15:59:25    

albino13 a écrit a écrit :

Dite moi ce que vous en pensez (certe j'y arrive mais pas comme je le pensais au depart...)
 

Code :
  1. typedef struct ma_struct
  2.   {
  3.   int num_demande;
  4.   int num_max;
  5.   }ma_struct;
  6. ma_struct miam; /* var global */

 
 

Code :
  1. void fverifNumCli(int sNumCli)
  2. {
  3.   FILE *fclient;
  4.   int repv,max;
  5.   max=0;
  6.   if ((fclient=fopen("client.dat","r" ))==NULL)
  7.     repv=-1;
  8.     else
  9.     {
  10.       do
  11.       {
  12.         if(client.numCli==sNumCli)
  13.           do
  14.           {
  15.             if(client.numCli>max)
  16.             {
  17.               max=client.numCli;
  18.               repv=max;
  19.             }
  20.           }
  21.           while (fread(&client,sizeof(struct sclient),1,fclient),!feof(fclient));
  22.             else
  23.               repv=0;
  24.       }
  25.       while (fread(&client,sizeof(struct sclient),1,fclient),!feof(fclient));
  26.     }
  27. miam.num_demande=repv;
  28. miam.num_max= <--- ta valeur maximale
  29. return;
  30. }

 




Message édité par nicolasm le 21-10-2002 à 15:59:54
Reply

Marsh Posté le 22-10-2002 à 21:36:14    

Je comprend pas pkoi tu réouvre le fichier dans ta fonction fverifnum alors que tu l'as déjà ouvert précédemment tu pourais ptet passer ton FILE* en parametre. Sinon je comprend pas non plus pkoi tu fais scanf("%[\n]",&balblabla) tu connais pas scanf("%s",&blablabla)? ou si tu veux garder les espace t'as gets qui fait pareil.
Sinon je crois pas que ca veuille dire koike ce soit ça:

Code :
  1. while (fread(&client,sizeof(struct sclient),1,fclient),!feof(fclient));


Pour ta question t'as qu'à garder dans une variable temporaire le numcli max et tu l'update quand t'en trouve un plus grand...
 
Pour finir à koi sert ton programe? Si t'as besoin de gerer une base de donné de client pourquoi le faire en C alors que ya des trucs plus sympa pour ce genre de probleme genre sql

Reply

Marsh Posté le 23-10-2002 à 06:20:49    

sombresonge a écrit a écrit :

Je comprend pas pkoi tu réouvre le fichier dans ta fonction fverifnum alors que tu l'as déjà ouvert précédemment tu pourais ptet passer ton FILE* en parametre. Sinon je comprend pas non plus pkoi tu fais scanf("%[\n]",&balblabla) tu connais pas scanf("%s",&blablabla)? ou si tu veux garder les espace t'as gets qui fait pareil.(<= a premiere vu gets ne marche pas avec strncpy donc je suis passé par cette methode et oui c'est exactement pour conserver les espaces)
Sinon je crois pas que ca veuille dire koike ce soit ça:

Code :
  1. while (fread(&client,sizeof(struct sclient),1,fclient),!feof(fclient));


(<= alors je pense que ca veut bien dire qqchose vu que ca fonctionne tres bien dans d'autres fonctions mais je v te dire ce que je pense que ca veut dire...
alors fread= lit mon fichier. fread prend comme premiere valeur ma variable, ici &client qui correspond a la variable de ma struccture (=> structure ici =>struct sstock
{
  int numProd;
  char PU[7];
  char des[40];
  int stockMin;
  int stockActu;
} stock;
))
apres fread dois savoir que quel type dois etre stock dc sizeof et comme c''est une structure je lui dit (sizeof(nomMaStructure)
ensuite le nombre d'enregistrements qu'il dois lire a la fois ici 1, tout ceci il le lira dans le fichier concerné... ici le pointeur sur mon fichier (declaré dans FILE *NomFichier)
puis vu que c'est un while je lui donne la condition de fin ou pour etre plus precis la condition qui va ke faire continuer ici tant que feof(fclient) n'est pas vrai donc tant que je n'ai pas atteint la fin de fclient...
Biensur je suis nouveau donc je suis tres tres loin de tout savoir mais je ne fais que transposer ce que l'on m'apprend en cour donc si toi ou qqn d'autre a une autre proposition ou correction je suis preneur ;)  
 
 
Pour ta question t'as qu'à garder dans une variable temporaire le numcli max et tu l'update quand t'en trouve un plus grand...
 
Pour finir à koi sert ton programe? Si t'as besoin de gerer une base de donné de client pourquoi le faire en C alors que ya des trucs plus sympa pour ce genre de probleme genre sql(<= je suis entierement d'accord avec toi mais c'est pour une AP que je devrais presenter a mon examen de fin d'année... )



[i][/i]  [i][/i] [cpp]

Reply

Sujets relatifs:

Leave a Replay

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