#include #include #include /*************************************************************************************************** * Plusieurs enregistrements et possibilité de modification * * - Reprenez le code de l'exercice précédent et modifier le de manière à pouvoir encoder et * * sauver au maximum 5 enregistrements dans le fichier. * * * * - Ecrivez les fonctions qui permettent de rechercher un enregistrement, de le modifier et de * * sauvez la modification dans le fichier. La recherche se fera sur base du nom et on pourra * * supposer qu'il n'y a pas d'homonymes dans les 5 enregistrements. * ****************************************************************************************************/ #define chemin "donnees.dat" #define MAX 5 struct Donnees { char Nom [25] ; char Prenom[15] ; char Adresse [40]; int CodePostal ; char Localite [15]; }; short LireDonnee(struct Donnees *,FILE*); short LireEntier(struct Donnees *,char *,char *); short Caractere(char *,short); short Adresse(char *,short); void Aff(struct Donnees *,FILE*); void Modif(struct Donnees*,FILE*); int Rech(struct Donnees*); int main() { FILE *fp; struct Donnees New[MAX]; struct Donnees *pNew; pNew = &New[0]; short nb=0; int i=0; char c,n; fp = fopen (chemin, "r+b"); if (fp == NULL) { if (errno==ENOFILE) { fp = fopen (chemin, "w+b"); if (fp == NULL) { printf ("Erreur de creation du fichier %s (code d'erreur : %d) : %s\n",chemin,errno,strerror(errno)); } } else { printf ("Erreur d\'ouverture du fichier %s (code d'erreur : %d) : %s\n",chemin,errno,strerror(errno)); } } do { system("cls"); printf("\t|-----------------------------------------------------------------------------------|\n" "\t|-------------------------------- Menu des donnees ---------------------------------|\n" "\t|-----------------------------------------------------------------------------------|\n" "\t|1: Ajout de mes donnees dans le fichier |\n" "\t|2: Afficher les donnees du fichier |\n" "\t|3: Modification des donnees du fichier |\n" "\t|4: Recherche des donnees du fichier |\n" "\t|5: Quitter |\n" "\t|-----------------------------------------------------------------------------------|\n" ); do { printf("\n\tEntrer un choix : "); fflush(stdin); c= getchar(); switch(c) { case '1': system("cls"); if(nbNom,pNew ->Prenom,pNew ->Adresse,pNew ->CodePostal,pNew ->Localite); } else { printf("\nLe nom n\'existe pas\n"); } break; case '5': n='n'; break; default: printf("\nErreur. Aucun numero correspondant.\n"); } }while(c<'1'||c>'5'); if(c!='5') { do { printf("\n\t Voulez-vous retourner au menu principal (o/n) ? "); fflush(stdin); n= getchar(); }while(n!='o'&&n!='n'); printf("\n"); } }while(n=='o'); return 0; } /* Fonction pour ajouter les données dans le tableau de structure */ short LireDonnee(struct Donnees *pNew,FILE*fp) { short erreur,maxm=2; char cp[5]; //fp = fopen (chemin, "ab"); printf("\n\t\t----- Encodage d'une personne -----\n"); do { printf("\n\t Nom : "); fflush(stdin); erreur=Caractere(pNew -> Nom,25); if(erreur==1) { printf("\n Votre nom ne peut contenir que des caracteres \n"); } else if(erreur==2) { printf("\n Votre nom ne peut contenir que 25 caracteres \n"); } } while(erreur != 0); do { printf("\n\t Prenom : "); fflush(stdin); erreur=Caractere(pNew -> Prenom,15); if(erreur==1) { printf("\n Votre prenom ne peut contenir que des caracteres \n"); } else if(erreur==2) { printf("\n Votre prenom ne peut contenir que 15 caracteres \n"); } } while(erreur != 0); do { printf("\n\t Adresse : "); fflush(stdin); erreur=Adresse(pNew -> Adresse,30); if(erreur==1) { printf("\n Votre intitule ne peut contenir que des caracteres \n"); } else if(erreur==2) { printf("\n Votre intitule ne peut contenir que 30 caracteres \n"); } } while(erreur != 0); do { printf("\n\t Code Postal : "); fflush(stdin); erreur = LireEntier(pNew,&cp[0],&cp[0]); if (erreur==1) { printf("\n La cp a au maximum 4 chiffres.\n"); } else if(erreur==2) { printf("\n La cp ne contient que des chiffres.\n"); } }while(erreur!=0); do { printf("\n\t Localite : "); fflush(stdin); erreur=Caractere(pNew ->Localite,30); if(erreur==1) { printf("\n Votre localite ne peut contenir que des caracteres \n"); } else if(erreur==2) { printf("\n Votre localite ne peut contenir que 30 caracteres \n"); } } while(erreur != 0); printf("\n\n\t ____________________________________________\n"); fseek(fp,-sizeof(pNew),SEEK_CUR); fwrite (pNew, sizeof(*pNew), 1, fp); //fprintf(fp, "%s \r\n %s \r\n %s \r\n %d \r\n %s \r\n",pNew ->Nom,pNew ->Prenom,pNew ->Adresse,pNew ->CodePostal,pNew ->Localite); fclose(fp); } int Rech(struct Donnees *pNew) { char Nom [11]; int trouve=1,i=0; FILE *fp; fp=fopen(chemin, "rb"); scanf ("%s", Nom); while (fread(pNew , sizeof(*pNew) , 1 , fp )!=NULL) // tant que la fin du fichier n'est pas atteint { if (Nom) // si un numero de compte a ete saisi { trouve=(strcmp(Nom, pNew ->Nom)); } i++; // si on a trouve on sort du while if (trouve==0) break; } // fin du while if (trouve==0) return i; else return 0; } void Aff(struct Donnees *a,FILE*fp) { size_t i =0; fp= fopen (chemin, "rb"); while(fread(a , sizeof(*a) , 1 , fp )>0) { printf("\n"); printf("\t\t----- %hd -----\n",i+1); printf("\n\t\t Nom : %s",a -> Nom); printf("\n\t\t Prenom : %s",a -> Prenom); printf("\n\t\t Adresse : %s",a -> Adresse); printf("\n\t\t Code Postal : %d",a -> CodePostal); printf("\n\t\t Localite : %s",a -> Localite); printf("\n\n\t ____________________________________________\n"); i++; } fclose(fp); } void Modif(struct Donnees *pNew,FILE*fp) { int nb; nb=Rech(pNew); if(nb!=0) fp= fopen (chemin, "w+b"); fseek(fp, nb*sizeof(pNew),SEEK_SET); //fseek(fp, nb, SEEK_CUR); LireDonnee(pNew,fp); fclose(fp); } /* Fonction pour vérifier les entiers */ short LireEntier(struct Donnees *pNew,char *pc, char *dbt) { char c; short i=0,erreur=0; fflush(stdin); c=getchar(); if(c<'0'&& c>'9') { erreur=2; } else{ while((c != '\n')&& (c>='0'&& c<='9')) { *pc = c; pc++; i++; c = getchar(); if(c<'0'&& c>'9') { erreur=2; break; } } *pc = '\0'; } if(i!=4&&erreur==0) { erreur = 1; } pNew-> CodePostal = atoi(dbt); return erreur; } /* Fonction pour vérifier des caracteres */ short Caractere(char *pc,short nb) { char c; short i=1,erreur=0; fflush(stdin); c=getchar(); if ((c>='a'&&c<='z')||(c>='A'&&c<='Z')) { while (c != '\n') { *pc=c; pc++; c=getchar(); if (c>='0'&&c<='9') { erreur=1; } else { if((c!=0&&c!='\n')||(c==32)) { i++; } else if (c=='\n') { break; } else if ((c<'a'||c>'z')&&c!='\n') { erreur=1; break; } } } *pc = '\0'; if (i > nb) { erreur=2; } } else if(c=='\n') { *pc = '\0'; } else { erreur=1; } return erreur; } /* Fonction pour vérifier l'adresse */ short Adresse(char *pc,short nb) { char c; short i=1,erreur=0; fflush(stdin); c=getchar(); if ((c>='a'&&c<='z')||(c>='A'&&c<='Z')) { while (c != '\n') { *pc = c; pc++; c=getchar(); if(c!=0||c==32) { i++; } else if ((c<'a'||c>'z')&&c!=' ') { erreur=1; break; } } *pc = '\0'; if (i > nb) { erreur=2; } } else { erreur=1; } return erreur; }