From c0a403c3e2964986a8763d02ab407f64ff99a954 Mon Sep 17 00:00:00 2001 From: Adrien VAN DAMME Date: Fri, 21 Apr 2017 15:16:50 +0200 Subject: [PATCH] FIN 29 --- VANDAMME29.c | 273 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 185 insertions(+), 88 deletions(-) diff --git a/VANDAMME29.c b/VANDAMME29.c index a9560aa..d51292b 100644 --- a/VANDAMME29.c +++ b/VANDAMME29.c @@ -4,7 +4,7 @@ *------------------------------------------------------------ *|UINTL NBClients|Bool Tri| Client 0 | Client 1 | .......ETc| *------------------------------------------------------------ - * + *NombreClients est stocké dans mon fichier * */ @@ -59,6 +59,12 @@ typedef struct{ long ofsetFichierDat; long ofsetFichierTXT; } Client; +typedef struct{ + FILE * bin; + FILE * txt; + char emplacementBin[__STRLEN_FILE__]; + char emplacementTXT[__STRLEN_FILE__]; +} FichierClient; // En cours de modif, sera utiliser dans les futur version @@ -77,11 +83,11 @@ int itoaY(int i, char*); int itoaDM(int i, char*); Bool clean_keyboard(); int ageClient(Client *, Date *); -long int rechercheClient(char *, char*, FILE *, Client *, Date *); -Bool gestionClient(Client *, Date *, FILE *, FILE *); +long int rechercheClient(char *, char*, FichierClient *, Client *, Date *); +Bool gestionClient(Client *, Date *, FichierClient *); int compNP(char *, char *,char *, char *); -void localiserFichiersClients(char *, FILE **, FILE **); -int sauvegarderClientFile(FILE *, FILE *, Client *); //enregistre le client dans le fichier dat et txt +void localiserFichiersClients(FichierClient *); +int sauvegarderClientFile(FichierClient *, Client *); //enregistre le client dans le fichier dat et txt FILE * creerFichier(Date *, Client *); Bool fichierExistant(char *); void sauvergarderFacture(FILE *, Date *, Client *); @@ -90,19 +96,23 @@ si long = 0, n'affiche pas l'age, enregistre a la position courante = 1, affiche l'age qui est repris sur le 4e arguments (int) (pour une facture par ex), enregistre a la position courante > 1, ecris sans l'age mais a la position demandé (3e arg, long) */ -void clientBinToTXT(FILE *, FILE*);//En cours de dev -void modificationClient(Client *, FILE *, FILE *); - +void clientBinToTXT(FichierClient *);//SauvegarderClientsTxt +void modificationClient(Client *, FichierClient*); +long unsigned int nombreClients(FichierClient*); +void recupererClients(FichierClient*, Client ***); //Mon tableau se terminera par un pointeur null, inutile de mettre ça longueur +void positionCurseurBinaireSurClient(FichierClient*); +void afficherListeClients(Client **); int main() { //printf("%d\n", pointsFidelite(52.23)); - FILE * clientDatF = NULL; - FILE * clientTXTF = NULL; + FichierClient fichierClient = {NULL, NULL}; Client * client; + Client ** clientTab = NULL; + long int ofsetFileCurClient = 0; + unsigned long int nbrClient = 0, idClient = 0; if(ofsetFileCurClient);//Pour ne pas avoir de warn char nomClient[__STRLEN__],prenomClient[__STRLEN__]; - char fichierClientDat[__STRLEN_FILE__]; int choixMenu; Date date; char tmp; @@ -122,47 +132,69 @@ int main() date.annee = locTime->tm_year; // printf("%d/%d/%d\n", date->jour, date->moi, date->annee ); } - localiserFichiersClients(fichierClientDat, &clientDatF, &clientTXTF); + localiserFichiersClients(&fichierClient); + nbrClient = nombreClients(&fichierClient); while(w) { printf("1. Nouveau client\n"); printf("2. Client enregistré\n"); + printf("3. Liste des client\n"); do{ - printf("Choix (1|2):");clean_keyboard();scanf("%d", &choixMenu); - }while(!(choixMenu<=2 && choixMenu>=1)); + printf("Choix (1|2|3):");clean_keyboard();scanf("%d", &choixMenu); + }while(!(choixMenu<=3 && choixMenu>=1)); switch (choixMenu) { case 1: - client = malloc(sizeof(Client)); + client = (Client*)malloc(sizeof(Client)); client->ofsetFichierDat = 0; client->ofsetFichierTXT = 0; encoderClient(client); afficherClient(client, &date); - fseek(clientTXTF, 0, SEEK_END); - sauvegarderClientFile(clientTXTF, clientDatF, client); - w = gestionClient(client, &date, clientDatF, clientTXTF); + fseek(fichierClient.txt, 0, SEEK_END); + sauvegarderClientFile(&fichierClient, client); + w = gestionClient(client, &date, &fichierClient); + nbrClient++; + free(client); break; case 2: - client = malloc(sizeof(Client)); + client = (Client*)malloc(sizeof(Client)); printf("\nNom du client (sensible a la casse) : "); clean_keyboard();scanf("%s", nomClient); printf("\nPrenom du client (sensible a la casse) : "); clean_keyboard();scanf("%s", prenomClient); - ofsetFileCurClient = rechercheClient(nomClient,prenomClient, clientDatF, client, &date); + ofsetFileCurClient = rechercheClient(nomClient,prenomClient, &fichierClient, client, &date); if(ofsetFileCurClient) { - w = gestionClient(client, &date, clientDatF, clientTXTF); + w = gestionClient(client, &date, &fichierClient); } else { printf("\nClient non trouvé !\n"); } + free(client); + break; + case 3: + recupererClients(&fichierClient, &clientTab); + printf("0 : Retour\n"); + afficherListeClients(clientTab); + do { + printf("Entrez l'id du client :"); clean_keyboard();scanf("%lu", &idClient); + } while(idClient > nbrClient); + printf("dbg %lu\n", idClient); + if(idClient != 0) + { + client = *(clientTab+(idClient-1)); + w = gestionClient(client, &date, &fichierClient); + } + while(*clientTab) + free(*clientTab++); + free(clientTab); break; } } - free(client); - fclose(clientDatF); - fclose(clientTXTF); + + fclose(fichierClient.txt); + fclose(fichierClient.bin); return 0; } void encoderDate(Date * date, char *invite) @@ -240,7 +272,7 @@ void afficherClient(Client *client, Date *date) printf("code postal : %d\n",client->adresse.codePostal); printf("numéro de tél. : %s\n",client->contact.telephone); printf("adresse email : %s\n",client->contact.email); - printf("\nPoints de fidelite aqui : %d\n", client->fidelite); + printf("\nPoints de fidelite acquis : %d\n", client->fidelite); } void sauvegarderClientTXT(Client *client, FILE * file, long arg, ...) //EcrireDonneesClient { @@ -270,7 +302,7 @@ void sauvegarderClientTXT(Client *client, FILE * file, long arg, ...) //EcrireDo fprintf(file, "adresse email : %s\n",client->contact.email); if(arg == 1) { - fprintf(file, "\nPoints de fidelite aqui : %d\n", client->fidelite); + fprintf(file, "\nPoints de fidelite acquis : %d\n", client->fidelite); } else { @@ -377,7 +409,7 @@ void sauvergarderFacture(FILE * file, Date * date, Client * client) } fprintf(file,"\n|---------------------------------------------------------------------------------------------|"); fprintf(file,"\nPrix totale :%f", prixTot); - fprintf(file, "\nPoints de fidelite aqui : %d\n", client->fidelite); + fprintf(file, "\nPoints de fidelite acquis : %d\n", client->fidelite); } void afficherFacture(Date * date, Client * client) @@ -405,7 +437,7 @@ void afficherFacture(Date * date, Client * client) printf("\n|---------------------------------------------------------------------------------------------|"); client->fidelite = pointsFidelite(prixTot); printf("\nPrix totale :%f", prixTot); - printf("\nPoints de fidelite aqui : %d\n", client->fidelite); + printf("\nPoints de fidelite acquis : %d\n", client->fidelite); } @@ -474,28 +506,28 @@ void gestionFacture(Client * client, Date * date) free(client->panier.article); } -long int rechercheClient(char *nom, char *prenom, FILE * clientDatF, Client * client, Date * date) +long int rechercheClient(char *nom, char *prenom, FichierClient *fichierClient,Client * client, Date * date) { long int ofsetFileCurClient; int t; - fseek(clientDatF, sizeof(unsigned long int)+sizeof(Bool), SEEK_SET); - clearerr(clientDatF); //Clear EOF + fseek(fichierClient->bin, sizeof(unsigned long int)+sizeof(Bool), SEEK_SET); + clearerr(fichierClient->bin); //Clear EOF do { - ofsetFileCurClient = ftell(clientDatF); - fread(client, sizeof(Client), 1, clientDatF); + ofsetFileCurClient = ftell(fichierClient->bin); + fread(client, sizeof(Client), 1, fichierClient->bin); t = compNP(client->nom, client->prenom, nom, prenom); - }while(!feof(clientDatF) && t); - if(feof(clientDatF)) + }while(!feof(fichierClient->bin) && t); + if(feof(fichierClient->bin)) { client = NULL; - return NULL; + return 0; } else return ofsetFileCurClient; } -Bool gestionClient(Client * client, Date * date, FILE * clientDatF, FILE * clientTXTF) +Bool gestionClient(Client * client, Date * date, FichierClient *fichierClient) { char choix; while(1) @@ -515,24 +547,24 @@ Bool gestionClient(Client * client, Date * date, FILE * clientDatF, FILE * clien afficherClient(client, date); break; case 'b': - modificationClient(client, clientDatF, clientTXTF); + modificationClient(client, fichierClient); break; case 'c': gestionFacture(client, date); break; case 'd': - sauvegarderClientFile(clientTXTF, clientDatF, client); + sauvegarderClientFile(fichierClient, client); return 1; break; case 'e': - sauvegarderClientFile(clientTXTF, clientDatF, client); + sauvegarderClientFile(fichierClient, client); return 0; break; } } } -void localiserFichiersClients(char * fichierClientDat, FILE ** clientDatF, FILE ** clientTXTF) +void localiserFichiersClients(FichierClient *fichierClient) { char rep[__STRLEN_FILE__]; @@ -544,70 +576,71 @@ void localiserFichiersClients(char * fichierClientDat, FILE ** clientDatF, FILE scanf("%s", rep); sprintf(repTmp[__TAB_CLIENTDAT_FILE__],"%sclients.dat", rep); sprintf(repTmp[__TAB_CLIENTTXT_FILE__],"%sclients.txt", rep); - *clientTXTF = fopen(repTmp[__TAB_CLIENTTXT_FILE__], "r"); //A faire Une verification correcte se ferait avec access (voir GNU libc P418) - *clientDatF = fopen(repTmp[__TAB_CLIENTDAT_FILE__], "r"); //A faire Une verification correcte se ferait avec access (voir GNU libc P418) - if(*clientDatF == NULL || *clientTXTF == NULL) //Si un des fichier n'existe pas + fichierClient->txt = fopen(repTmp[__TAB_CLIENTTXT_FILE__], "r"); //A faire Une verification correcte se ferait avec access (voir GNU libc P418) + fichierClient->bin = fopen(repTmp[__TAB_CLIENTDAT_FILE__], "r"); //A faire Une verification correcte se ferait avec access (voir GNU libc P418) + if(fichierClient->bin == NULL || fichierClient->txt == NULL) //Si un des fichier n'existe pas { char c; printf("\nUn fichier n'existe pas. Voulez-vous les creers (C) ou changer de repertoir (R). (C|R)?"); - if(!(*clientDatF == NULL && *clientTXTF == NULL)) + if(!(fichierClient->bin == NULL && fichierClient->txt == NULL)) printf("Attention un des deux fichier a été détecter ! Il seront remis a 0 si vous les creers\nChoix (C|R):" ); clean_keyboard();scanf("%c", &c); if((c|0b00100000) == 'c') { - fclose(*clientDatF); - fclose(*clientTXTF); - *clientDatF = fopen(repTmp[__TAB_CLIENTDAT_FILE__], "wb"); - *clientTXTF = fopen(repTmp[__TAB_CLIENTTXT_FILE__], "w"); - fwrite(&nbClients, sizeof(nbClients), 1, *clientDatF); - fwrite(&tri, sizeof(tri), 1, *clientDatF); - fclose(*clientDatF); - fclose(*clientTXTF); + fclose(fichierClient->bin); + fclose(fichierClient->txt); + fichierClient->bin = fopen(repTmp[__TAB_CLIENTDAT_FILE__], "wb"); + fichierClient->txt = fopen(repTmp[__TAB_CLIENTTXT_FILE__], "w"); + fwrite(&nbClients, sizeof(nbClients), 1, fichierClient->bin); + fwrite(&tri, sizeof(tri), 1, fichierClient->bin); + fclose(fichierClient->bin); + fclose(fichierClient->txt); } else - localiserFichiersClients(fichierClientDat, clientDatF, clientTXTF); + localiserFichiersClients(fichierClient); } else { - fclose(*clientDatF); - fclose(*clientTXTF); + fclose(fichierClient->bin); + fclose(fichierClient->txt); } - clearerr(*clientDatF);clearerr(*clientTXTF); - *clientDatF = fopen(repTmp[__TAB_CLIENTDAT_FILE__], "r+b"); - *clientTXTF = fopen(repTmp[__TAB_CLIENTTXT_FILE__], "r+"); - strcpy(fichierClientDat, repTmp[__TAB_CLIENTDAT_FILE__]); - if(*clientDatF == NULL || *clientTXTF == NULL) + clearerr(fichierClient->bin);clearerr(fichierClient->txt); + fichierClient->bin = fopen(repTmp[__TAB_CLIENTDAT_FILE__], "r+b"); + fichierClient->txt = fopen(repTmp[__TAB_CLIENTTXT_FILE__], "r+"); + strcpy(fichierClient->emplacementBin, repTmp[__TAB_CLIENTDAT_FILE__]); + strcpy(fichierClient->emplacementTXT, repTmp[__TAB_CLIENTTXT_FILE__]); + if(fichierClient->bin == NULL || fichierClient->txt == NULL) { printf("\nErreur ouverture fichier"); - localiserFichiersClients(fichierClientDat, clientDatF, clientTXTF); + localiserFichiersClients(fichierClient); } } -int sauvegarderClientFile(FILE * clientTXTF, FILE * clientDatF, Client * client) +int sauvegarderClientFile(FichierClient *fichierClient, Client * client) { /* Si Nouveau client ofsetFichierDat = 0 donc nouveau client sinon on decale de l'ofset */ if(!client->ofsetFichierDat) { unsigned long int nbrClient; - fseek(clientDatF, 0, SEEK_SET); + fseek(fichierClient->bin, 0, SEEK_SET); - fread(&nbrClient,sizeof(nbrClient),1,clientDatF); + fread(&nbrClient,sizeof(nbrClient),1,fichierClient->bin); nbrClient++; - fseek(clientDatF, 0, SEEK_SET); - fwrite(&nbrClient,sizeof(nbrClient),1,clientDatF); + fseek(fichierClient->bin, 0, SEEK_SET); + fwrite(&nbrClient,sizeof(nbrClient),1,fichierClient->bin); - fseek(clientDatF, 0, SEEK_END); - fseek(clientTXTF, 0, SEEK_END); - client->ofsetFichierDat = ftell(clientDatF); - client->ofsetFichierTXT = ftell(clientTXTF); - sauvegarderClientTXT(client, clientTXTF, 0); - fflush(clientTXTF); + fseek(fichierClient->bin, 0, SEEK_END); + fseek(fichierClient->txt, 0, SEEK_END); + client->ofsetFichierDat = ftell(fichierClient->bin); + client->ofsetFichierTXT = ftell(fichierClient->txt); + sauvegarderClientTXT(client, fichierClient->txt, 0); + fflush(fichierClient->txt); } else - fseek(clientDatF, client->ofsetFichierDat, SEEK_SET); - fwrite(client, sizeof(Client), 1, clientDatF); - fflush(clientDatF); + fseek(fichierClient->bin, client->ofsetFichierDat, SEEK_SET); + fwrite(client, sizeof(Client), 1, fichierClient->bin); + fflush(fichierClient->bin); return client->ofsetFichierDat; } @@ -633,24 +666,24 @@ int compNP(char *nom1, char *prenom1,char *nom2, char *prenom2) return renvois; } -void clientBinToTXT(FILE * bin, FILE* txt)/*Si je veux sup des client, il fau que j'aie le nom du fichier +void clientBinToTXT(FichierClient *fichierClient)/*Si je veux sup des client, il fau que j'aie le nom du fichier le standard c n'autorise que l'ajout et la modif EN COURS*/ { Client client; - fseek(bin, 0, SEEK_SET);fseek(txt, 0, SEEK_SET); - clearerr(bin);clearerr(txt); - fseek(bin, sizeof(unsigned long int), SEEK_CUR); - fseek(bin, sizeof(Bool), SEEK_CUR); - while(!feof(bin)) + fseek(fichierClient->bin, 0, SEEK_SET);fseek(fichierClient->txt, 0, SEEK_SET); + clearerr(fichierClient->bin);clearerr(fichierClient->txt); + fseek(fichierClient->bin, sizeof(unsigned long int), SEEK_CUR); + fseek(fichierClient->bin, sizeof(Bool), SEEK_CUR); + while(!feof(fichierClient->bin)) { - if(fread(&client, sizeof(Client), 1,bin)) - sauvegarderClientTXT(&client, txt, 0); + if(fread(&client, sizeof(Client), 1,fichierClient->bin)) + sauvegarderClientTXT(&client, fichierClient->txt, 0); } - fflush(txt); + fflush(fichierClient->txt); // fread() } -void modificationClient(Client * client, FILE * clientDatF, FILE * clientTXTF) +void modificationClient(Client * client, FichierClient * fichierClient) { char choix = 0; void * aModifier[] = {(Adresse *)&client->adresse, (char *)&client->contact.telephone, (char *)&client->contact.email}; @@ -687,6 +720,70 @@ void modificationClient(Client * client, FILE * clientDatF, FILE * clientTXTF) printf("Y-a-til encore des Modification (y|n) ?"); clean_keyboard();scanf("%c", &choix); }while((choix|0b00100000) == 'y'); - sauvegarderClientFile(clientTXTF, clientDatF, client); - clientBinToTXT(clientDatF, clientTXTF); + sauvegarderClientFile(fichierClient, client); + clientBinToTXT(fichierClient); +} + +long unsigned int nombreClients(FichierClient* fichierClient) +{ + unsigned long int nbrClient; + fseek(fichierClient->bin, 0, SEEK_SET); + + fread(&nbrClient,sizeof(nbrClient),1,fichierClient->bin); + return nbrClient; +} +void recupererClients(FichierClient* fichierClient, Client *** clientTab) +{ + unsigned int i; + unsigned long int nbrClients = nombreClients(fichierClient); + *clientTab = (Client **)calloc(nbrClients+1, sizeof(Client *)); //J'initialise avec des 0 mon tableau de pointeur + *(*clientTab+nbrClients) = NULL; + if(*clientTab == NULL) + { + printf("\nErreur allocation **clientTab!\n"); + } + positionCurseurBinaireSurClient(fichierClient); + for(i=0; ibin); i++) + { + *(*clientTab+i) = (Client*)malloc(sizeof(Client)); + if(*(*clientTab+i) == NULL) + { + for(;i>0;i--) + free(*(*clientTab+i)); + free(*(*clientTab)); + free(*clientTab); + printf("\nErreur allocation *clientTab!\n"); + exit(-1); + } + else + { + fread(*(*clientTab+i), sizeof(Client), 1, fichierClient->bin); + } + } + if(feof(fichierClient->bin)) + { + printf("\nUne erreur c'est produite le nbr de client est incorecte !\n"); + for(--i;i>0;i--) + free(*(*clientTab+i)); + free(*(*clientTab)); + free(*clientTab); + exit(-1); + } +} + +void positionCurseurBinaireSurClient(FichierClient * fichierClient) +{ + fseek(fichierClient->bin, 0, SEEK_SET); + fseek(fichierClient->bin, sizeof(unsigned long int), SEEK_CUR); + fseek(fichierClient->bin, sizeof(Bool), SEEK_CUR); +} + +void afficherListeClients(Client ** clientTab) +{ + unsigned long int i; + for(i=0;*(clientTab+i) != NULL;i++) + { + printf("Client %lu : %s %s\n", i+1, (*(clientTab+i))->nom, (*(clientTab+i))->prenom); + } + }