Compare commits

..

24 Commits
dev ... master

Author SHA1 Message Date
adriy 9521101317 Nettoyage debug 2017-05-19 09:16:49 +00:00
adriy a044cf8437 Correction Bug pointeur menu 3 vers 1
fuite mémooire car changement de pointeur qui est le pointeur du tableau. Si on modif se pointeur ça modif le tableau. Donc utilisation de memcpy pour ne pas changé le pointeur
2017-05-19 09:12:49 +00:00
adriy a1065d9a44 Plus secure 2017-05-18 22:48:58 +00:00
adriy 5c55c3e483 ajout commentaire suprimerElemListeArticle 2017-05-12 12:59:33 +00:00
adriy 044fef6af0 test&build OK 2017-05-12 12:55:18 +00:00
adriy 85a652f27e Mettre à jour 'VANDAMME31.c' 2017-05-09 20:48:12 +00:00
adriy 2c71d081bb buil&FirstTest OK 2017-05-05 14:40:04 +00:00
adriy a408a43569 compil&test OK 2017-04-28 14:53:59 +00:00
Adrien VAN DAMME c0a403c3e2 FIN 29 2017-04-21 15:16:50 +02:00
Adrien VAN DAMME da768d089c add 29 2017-04-21 12:06:47 +02:00
adriy aa9900460a bug recherche client (ok) & svgarde modif client ds txt 2017-04-20 19:39:08 +00:00
Adrien VAN DAMME b3e76c6e93 BUILD&TEST Ok 2017-04-07 12:44:47 +02:00
Adrien VAN DAMME a5f3357e8a BUILD&TEST OK 2017-04-07 12:26:39 +02:00
Adrien VAN DAMME eb51c467a5 L327 2017-04-07 10:32:52 +02:00
Adrien VAN DAMME cf1e345e9d dateValide 2017-04-05 23:09:18 +02:00
Adrien VAN DAMME f45f74fab6 ok 2017-04-05 23:06:44 +02:00
Adrien VAN DAMME 5db75ac97e Prbl Fichier 2017-04-04 22:52:21 +02:00
Adrien VAN DAMME 879ac887ce ... 2017-04-04 20:12:52 +02:00
Adrien VAN DAMME e1654ee12e ... 2017-04-03 13:35:51 +02:00
Adrien VAN DAMME e90e7b5511 ok 2017-04-03 10:57:10 +02:00
Adrien VAN DAMME 3c0ea942f5 OK, en cours de dev 2017-04-02 19:10:59 +02:00
Adrien VAN DAMME a52ee5d95e ... 2017-04-02 17:02:15 +02:00
Adrien VAN DAMME 2a99d7a734 ... 2017-04-02 17:00:23 +02:00
Adrien VAN DAMME c1b425991b ... 2017-04-02 16:44:34 +02:00
6 changed files with 5328 additions and 653 deletions

View File

@ -35,7 +35,6 @@ typedef struct{
} Contact; } Contact;
typedef struct{ typedef struct{
char nom[__STRLEN__]; char nom[__STRLEN__];
char prenom[__STRLEN__];
Adresse adresse; Adresse adresse;
Contact contact; Contact contact;
Date anniversaire; Date anniversaire;
@ -64,25 +63,22 @@ Bool clean_keyboard();
int ageClient(Client *, Date *); int ageClient(Client *, Date *);
int pointsFidelite(float); int pointsFidelite(float);
void gestionFacture(Client *, Date *); void gestionFacture(Client *, Date *);
Client * rechercheClient(char *, char *, FILE *, Date *); Client * rechercheClient(char *, FILE *, Date *);
Bool gestionClient(Client *, Date *); Bool gestionClient(Client *, Date *);
FILE * localiserFichierClients(char *); FILE * localiserFichierClients(char *);
int ajouterClientBin(FILE *, Client *); int ajouterClientBin(FILE *, Client * client);
int compNP(char *, char *,char *, char *);
void qSortClientBinByNP(FILE *);
int main() int main()
{ {
//printf("%d\n", pointsFidelite(52.23));
FILE * clientF; FILE * clientF;
Date date; Date date;
char tmp; char tmp;
Bool w; Bool w;
time_t curTimeStamp = time(NULL); time_t curTimeStamp = time(NULL);
struct tm *locTime = localtime(&curTimeStamp); struct tm *locTime = localtime(&curTimeStamp);
locTime->tm_mon += 1; locTime->tm_mon += 1;
locTime->tm_year += 1900; locTime->tm_year += 1900;
printf("Voulez-vous utilisez la date système %d/%d/%d (Y|n)?\n", locTime->tm_mday,locTime->tm_mon,locTime->tm_year); printf("Voulez-vous utilisez la date système %d/%d/%d (Y|n)?\n", locTime->tm_mday,locTime->tm_mon,locTime->tm_year);
scanf("%c", &tmp); scanf("%c", &tmp);
if((tmp|0b00100000) != 'y') if((tmp|0b00100000) != 'y')
@ -92,11 +88,11 @@ int main()
date.jour = locTime->tm_mday; date.jour = locTime->tm_mday;
date.moi = locTime->tm_mon; date.moi = locTime->tm_mon;
date.annee = locTime->tm_year; date.annee = locTime->tm_year;
// printf("%d/%d/%d\n", date->jour, date->moi, date->annee );
} }
Client * client; Client * client;
char nomClient[__STRLEN__]; char nomClient[__STRLEN__];
char prenomClient[__STRLEN__];
char fichierClient[__STRLEN_FILE__]; char fichierClient[__STRLEN_FILE__];
int choixMenu; int choixMenu;
clientF = localiserFichierClients(fichierClient); clientF = localiserFichierClients(fichierClient);
@ -119,9 +115,7 @@ int main()
case 2: case 2:
printf("Nom du client (sensible a la casse) : "); printf("Nom du client (sensible a la casse) : ");
clean_keyboard();scanf("%s", nomClient); clean_keyboard();scanf("%s", nomClient);
printf("\nPrenom du client (sensible a la casse) : "); client = rechercheClient(nomClient, clientF, &date);
clean_keyboard();scanf("%s", prenomClient);
client = rechercheClient(nomClient, prenomClient clientF, &date);
if(client != NULL) if(client != NULL)
{ {
w = gestionClient(client, &date); w = gestionClient(client, &date);
@ -181,20 +175,19 @@ void encoderArticle(Article * article)
void encoderClient(Client * client) void encoderClient(Client * client)
{ {
printf("Encodage Client\n"); printf("Encoage Client\n");
client->fidelite = 0; client->fidelite = 0;
if(!(printf("Entrez la rue :") && clean_keyboard() && fgets(client->adresse.rue,__STRLEN__,stdin) != NULL && \ if(!(printf("Entrez la rue :") && clean_keyboard() && fgets(client->adresse.rue,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le numero :" ) && clean_keyboard() && fgets(client->adresse.numero,__STRLEN__,stdin) != NULL && \ printf("\nEntrez le numero :" ) && clean_keyboard() && fgets(client->adresse.numero,__STRLEN__,stdin) != NULL && \
printf("\nEntrez la localité :") && clean_keyboard() && fgets(client->adresse.localite,__STRLEN__,stdin) != NULL && \ printf("\nEntrez la localité :") && clean_keyboard() && fgets(client->adresse.localite,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le code postal :") && clean_keyboard() && scanf("%d", &(client->adresse.codePostal)) && \ printf("\nEntrez le code postal :") && clean_keyboard() && scanf("%d", &(client->adresse.codePostal)) && \
printf("\nNom client :") && clean_keyboard() && fgets(client->nom,__STRLEN__,stdin) != NULL) && \ printf("\nNom client :") && clean_keyboard() && fgets(client->nom,__STRLEN__,stdin) != NULL))
printf("\nPrenom client :") && clean_keyboard() && fgets(client->prenom,__STRLEN__,stdin) != NULL))
{ {
printf("\nErreur lors de l'encodage de l'adresse"); printf("\nErreur lors de l'encodage de l'adresse");
exit(-1); exit(-1);
} }
cleanFgets(client->adresse.rue);cleanFgets(client->adresse.numero);cleanFgets(client->adresse.localite); cleanFgets(client->adresse.rue);cleanFgets(client->adresse.numero);cleanFgets(client->adresse.localite);
cleanFgets(client->nom);cleanFgets(client->prenom); cleanFgets(client->nom);
if(!(printf("\n Entrez le numéro de tél. :") && clean_keyboard() &&fgets(client->contact.telephone,13,stdin) && \ if(!(printf("\n Entrez le numéro de tél. :") && clean_keyboard() &&fgets(client->contact.telephone,13,stdin) && \
printf("\nEntrez l'adresse email :") && clean_keyboard() &&fgets(client->contact.email,__STRLEN__,stdin))) printf("\nEntrez l'adresse email :") && clean_keyboard() &&fgets(client->contact.email,__STRLEN__,stdin)))
{ {
@ -206,7 +199,7 @@ void encoderClient(Client * client)
} }
void afficherClient(Client *client, Date *date) void afficherClient(Client *client, Date *date)
{ {
printf("Client : %s %s (%d)\n", client->nom, client->prenom, ageClient(client, date)); printf("Client : %s (%d)\n", client->nom, ageClient(client, date));
printf("rue : %s\n",client->adresse.rue); printf("rue : %s\n",client->adresse.rue);
printf("numero : %s\n",client->adresse.numero); printf("numero : %s\n",client->adresse.numero);
printf("localité : %s\n",client->adresse.localite); printf("localité : %s\n",client->adresse.localite);
@ -217,7 +210,7 @@ void afficherClient(Client *client, Date *date)
} }
void sauvegarderClient(Client *client, FILE * file, Date *date) void sauvegarderClient(Client *client, FILE * file, Date *date)
{ {
fprintf(file, "Client : %s %s (%d)\n", client->nom, client->prenom, ageClient(client, date)); fprintf(file, "Client : %s (%d)\n", client->nom, ageClient(client, date));
fprintf(file, "rue : %s\n",client->adresse.rue); fprintf(file, "rue : %s\n",client->adresse.rue);
fprintf(file, "numero : %s\n",client->adresse.numero); fprintf(file, "numero : %s\n",client->adresse.numero);
fprintf(file, "localité : %s\n",client->adresse.localite); fprintf(file, "localité : %s\n",client->adresse.localite);
@ -499,16 +492,16 @@ void gestionFacture(Client * client, Date * date)
free(client->panier.article); free(client->panier.article);
} }
Client * rechercheClient(char nom[__STRLEN__], char prenom[__STRLEN__], FILE * clientF, Date * date) Client * rechercheClient(char nom[__STRLEN__], FILE * clientF, Date * date)
{ {
Client * client = NULL; Client * client = NULL;
client = malloc(sizeof(Client)); client = malloc(sizeof(Client));
fseek(clientF, sizeof(unsigned long int)+sizeof(Bool), SEEK_SET); //On se possitionne apprès le nbr de client fseek(clientF, 0, SEEK_SET);
clearerr(clientF); //Clear EOF clearerr(clientF); //Clear EOF
do do
{ {
fread(client, sizeof(Client), 1, clientF); fread(client, sizeof(Client), 1, clientF);
}while(!feof(clientF) && compNP(client->nom, client->prenom, nom, prenom)); }while(!feof(clientF) && strcmp(client->nom, nom));
if(feof(clientF)) if(feof(clientF))
return NULL; return NULL;
else else
@ -558,26 +551,15 @@ FILE * localiserFichierClients(char fichierClient[__STRLEN_FILE__])
clientF = fopen(repTmp, "r"); clientF = fopen(repTmp, "r");
if(clientF == NULL) if(clientF == NULL)
{ {
char c;
fclose(clientF); fclose(clientF);
printf("\nLe fichier n'existe pas. Voulez-vous le creer (C) ou changer de repertoir (R) (C|R)?"); clientF = fopen(repTmp, "w");
clean_keyboard();scanf("%c", &c);
if(c&0b00100000 == 'c')
{
clientF = fopen(repTmp, "wb");
fwrite(0, sizeof(Bool), 1, clientF); //Les 1e bits stockent si fichier trier et le nbr de client
fwrite(0, sizeof(unsigned long int), 1, clientF);
fclose(clientF); fclose(clientF);
} }
else
return localiserFichierClients(fichierClient);
}
else
fclose(clientF); fclose(clientF);
clientF = fopen(repTmp, "r+b"); clientF = fopen(repTmp, "r+b");
if(clientF == NULL) if(clientF == NULL)
{ {
printf("\nErreur ouverture fichier"); printf("Erreur ouverture fichier");
return localiserFichierClients(fichierClient); return localiserFichierClients(fichierClient);
} }
strcpy(fichierClient, repTmp); strcpy(fichierClient, repTmp);
@ -587,67 +569,9 @@ FILE * localiserFichierClients(char fichierClient[__STRLEN_FILE__])
int ajouterClientBin(FILE * clientF, Client * client) int ajouterClientBin(FILE * clientF, Client * client)
{ {
int posi; int posi;
unsigned long int nbClient;
fseek(clientF,0,SEEK_SET);
fread(&nbClient,sizeof(unsigned long int),1,clientF);
fseek(clientF,0,SEEK_SET);
nbClient++;
fwrite(nbClient, sizeof(unsigned long int),1,clientF);
fseek(clientF, 0, SEEK_END); fseek(clientF, 0, SEEK_END);
posi = ftell(clientF); posi = ftell(clientF);
fwrite(client, sizeof(Client), 1, clientF); fwrite(client, sizeof(Client), 1, clientF);
fseek(clientF, 0, SEEK_END);
fflush(clientF); fflush(clientF);
return posi; return posi;
} }
int compNP(char nom1[__STRLEN__], char prenom1[__STRLEN__],char nom2[__STRLEN__], char prenom2[__STRLEN__])
{
char np1[__STRLEN__*2];
char np2[__STRLEN__*2];
sprinf(np1,"%s%s", nom1, prenom1);
sprinf(np2,"%s%s", nom2, prenom2);
return strcmp(np1,np2);
}
void qSortClientBinByNP(FILE * clientF)
{
Client client1, client2;
size_t sizeClient = sizeof(Client);
Bool trier;
fseek(clientF, 0, SEEK_SET);
clearerr(clientF);
unsigned long int nbrClients = 0;
fread(&nbrClients,sizeof(nbrClients),1, clientF);
fread(&trier, sizeof(Bool),1,clientF);
if(!trier)
{
const unsigned int start = ftell(clientF);
while(!feof(clientF))
{
fread(&client1, sizeClient, 1, clientF);
if(feof(clientF)) //On est a la fin du fichier inutile d'aller plus loin
break;
fread(&client2, sizeClient, 1, clientF);
switch (compNP(client1.nom,client1.prenom,client2.nom,client2.prenom))
{
case -1:
fseek(clientF,-sizeClient);
break;
case 1:
fseek(clientF,-(2*sizeClient));
fwrite(client2,sizeClient,1,clientF);
fwrite(client1,sizeClient,1,clientF);
if((ftell(clientF)-(2*sizeClient))>start) //On est au début du fichier, inutile de comparer l'élem précédent
fseek(clientF,-sizeClient);
else
fseek(clientF,-(3*sizeClient);
clearerr(clientF);
break;
case 0:
fseek(clientF,-sizeClient);
break;
}
fflush(clientF);
}
}
}

692
VANDAMME28.c Normal file
View File

@ -0,0 +1,692 @@
/*
* Fichier client :
*------------------------------------------------------------
*|UINTL NBClients|Bool Tri| Client 0 | Client 1 | .......ETc|
*------------------------------------------------------------
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <conio.h>
#include <sys/stat.h>
#include <time.h>
#include <string.h>
#include <stdarg.h>
#define __TVA__ 1.21
#define __REDUC__ 0.9
#define __MAXNBRART__ 3
#define __STRLEN__ 34
#define __STRLEN_FILE__ 500
#define __TAB_CLIENTDAT_FILE__ 0
#define __TAB_CLIENTTXT_FILE__ 1
typedef enum{FALSE,TRUE} Bool;
typedef struct {
char deisgnation[__STRLEN__];
float prixHTVA;
int quant;
} Article;
typedef struct {
Article * article;
unsigned int nbrArt;
} Panier;
typedef struct{
int jour,moi,annee;
} Date;
typedef struct{
char rue[__STRLEN__],numero[__STRLEN__],localite[__STRLEN__];
int codePostal;
} Adresse;
typedef struct{
char telephone[13],email[__STRLEN__];
} Contact;
typedef struct{
char nom[__STRLEN__];
char prenom[__STRLEN__];
Adresse adresse;
Contact contact;
Date anniversaire;
int fidelite;
Panier panier;
long ofsetFichierDat;
long ofsetFichierTXT;
} Client;
void encoderDate(Date *, char *);
Bool dateValide (Date *);
void encoderArticle(Article *);
void encoderClient(Client *);
void afficherClient(Client *, Date *);
void encoderFacture(Panier *);
void afficherFacture(Date *, Client *);
int pointsFidelite(float);
void gestionFacture(Client *, Date *);
void cleanFgets(char*);
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 *);
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
FILE * creerFichier(Date *, Client *);
Bool fichierExistant(char *);
void sauvergarderFacture(FILE *, Date *, Client *);
void sauvegarderClientTXT(Client *, FILE *, long,...); /*EcrireDonneesClient
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 *);
int main()
{
//printf("%d\n", pointsFidelite(52.23));
FILE * clientDatF = NULL;
FILE * clientTXTF = NULL;
Client * client;
long int ofsetFileCurClient = 0;
if(ofsetFileCurClient);//Pour ne pas avoir de warn
char nomClient[__STRLEN__],prenomClient[__STRLEN__];
char fichierClientDat[__STRLEN_FILE__];
int choixMenu;
Date date;
char tmp;
Bool w;
time_t curTimeStamp = time(NULL);
struct tm *locTime = localtime(&curTimeStamp);
locTime->tm_mon += 1;
locTime->tm_year += 1900;
printf("Voulez-vous utilisez la date système %d/%d/%d (Y|n)?\n", locTime->tm_mday,locTime->tm_mon,locTime->tm_year);
scanf("%c", &tmp);
if((tmp|0b00100000) != 'y')
encoderDate(&date, "Date facturation");
else
{
date.jour = locTime->tm_mday;
date.moi = locTime->tm_mon;
date.annee = locTime->tm_year;
// printf("%d/%d/%d\n", date->jour, date->moi, date->annee );
}
localiserFichiersClients(fichierClientDat, &clientDatF, &clientTXTF);
while(w)
{
printf("1. Nouveau client\n");
printf("2. Client enregistré\n");
do{
printf("Choix (1|2):");clean_keyboard();scanf("%d", &choixMenu);
}while(!(choixMenu<=2 && choixMenu>=1));
switch (choixMenu)
{
case 1:
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);
break;
case 2:
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);
if(ofsetFileCurClient)
{
w = gestionClient(client, &date, clientDatF, clientTXTF);
}
else
{
printf("\nClient non trouvé !\n");
}
break;
}
}
free(client);
fclose(clientDatF);
fclose(clientTXTF);
return 0;
}
void encoderDate(Date * date, char *invite)
{
do {
printf("\n%s\n", invite);
printf("Entrez la date sous cette forme : jj/mm/aaaa\n");
scanf("%d/%d/%d",&(date->jour),&(date->moi),&(date->annee));
} while(!dateValide(date));
}
Bool dateValide(Date * date)
{
int m = date->jour;
int d = date->moi;
int y = date->annee;
int daysinmonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))//Si bis février = 29
daysinmonth[1]=29;
if (m<13)
{
if( d <= daysinmonth[m-1] )
return 1;
else
return 0;
}
else
return 0;
}
void encoderArticle(Article * article)
{
printf("\nVeuillez entrer le nom : ");
clean_keyboard();
scanf("%34s", article->deisgnation);
printf("\nVeuillez entrer le prix a l'unite hors TVA : ");
clean_keyboard();
scanf("%f", &article->prixHTVA);
printf("\nVeuillez entrer la quantite desiree : ");
clean_keyboard();
scanf("%d", &article->quant);
}
void encoderClient(Client * client)
{
printf("\nEncoage Client\n");
client->fidelite = 0;
if(!(printf("Entrez la rue :") && clean_keyboard() && fgets(client->adresse.rue,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le numero :" ) && clean_keyboard() && fgets(client->adresse.numero,__STRLEN__,stdin) != NULL && \
printf("\nEntrez la localité :") && clean_keyboard() && fgets(client->adresse.localite,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le code postal :") && clean_keyboard() && scanf("%d", &(client->adresse.codePostal)) && \
printf("\nNom client :") && clean_keyboard() && fgets(client->nom,__STRLEN__,stdin) != NULL &&\
printf("\nPrenom client :") && clean_keyboard() && fgets(client->prenom,__STRLEN__,stdin) != NULL))
{
printf("\nErreur lors de l'encodage de l'adresse");
exit(-1);
}
cleanFgets(client->adresse.rue);cleanFgets(client->adresse.numero);cleanFgets(client->adresse.localite);
cleanFgets(client->nom);cleanFgets(client->prenom);
if(!(printf("\n Entrez le numéro de tél. :") && clean_keyboard() &&fgets(client->contact.telephone,13,stdin) && \
printf("\nEntrez l'adresse email :") && clean_keyboard() &&fgets(client->contact.email,__STRLEN__,stdin)))
{
printf("\nErreur lors de l'encodage des coo de contact");
exit(-1);
}
cleanFgets(client->contact.telephone);cleanFgets(client->contact.email);
encoderDate(&(client->anniversaire), "\nAnniversaire client:");
}
void afficherClient(Client *client, Date *date)
{
printf("\nClient : %s %s (%d)\n", client->nom, client->prenom, ageClient(client, date));
printf("rue : %s\n",client->adresse.rue);
printf("numero : %s\n",client->adresse.numero);
printf("localité : %s\n",client->adresse.localite);
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);
}
void sauvegarderClientTXT(Client *client, FILE * file, long arg, ...) //EcrireDonneesClient
{
va_list ap;
int age = 0;
va_start(ap, arg);
if(arg>1)
{
fseek(file, arg, SEEK_SET);
fprintf(file, "Client : %s %s", client->nom, client->prenom);
fprintf(file, "\n");
}
else if(arg == 1)
{
age = va_arg(ap,int);
fprintf(file, "Client : %s %s (%d)\n", client->nom, client->prenom,age);
}
else
{
fprintf(file, "Client : %s %s \n", client->nom, client->prenom);
}
fprintf(file, "rue : %s\n",client->adresse.rue);
fprintf(file, "numero : %s\n",client->adresse.numero);
fprintf(file, "localité : %s\n",client->adresse.localite);
fprintf(file, "code postal : %d\n",client->adresse.codePostal);
fprintf(file, "numéro de tél. : %s\n",client->contact.telephone);
fprintf(file, "adresse email : %s\n",client->contact.email);
if(arg == 1)
{
fprintf(file, "\nPoints de fidelite aqui : %d\n", client->fidelite);
}
else
{
fprintf(file, "\n===========================================================================\n");
}
va_end(ap);
}
void encoderFacture(Panier * panier)
{
char continuer = 'y';
do{
if(panier->nbrArt <= __MAXNBRART__)
{
encoderArticle(&(panier->article[panier->nbrArt-1]));
printf("Y-a-t-il encore un article ?(Y|n)");
clean_keyboard();
scanf("%c", &continuer);
if(panier->nbrArt < __MAXNBRART__ && (continuer|0b00100000) == 'y')
{
panier->nbrArt++;
Article * tempArticle;
tempArticle = (Article*)realloc(panier->article, sizeof(Article)*(panier->nbrArt));
if(panier->article == NULL)
{
printf("ERREUR ALLOCATION panier->article !");
free(tempArticle);
free(panier->article);
exit(-1);
}
else
{
panier->article = tempArticle;
}
}
else if((continuer|0b00100000) == 'y')
{
system("cls");
printf("Vous avez ateint le nombre d'article maximum !\n\n");
break;
}
}
}while((continuer|0b00100000) == 'y' && panier->nbrArt <= __MAXNBRART__);
}
FILE * creerFichier(Date * date, Client * client)
{
char fileName[__STRLEN__+16];
fileName[0] = '\0';
char dir[__STRLEN__];
int i;
printf("Dossier d'enregistrement : ");
clean_keyboard();
scanf("%s", dir);
sprintf(fileName, "%s%d%d%d_", client->nom, date->annee, date->moi, date->jour);
for(i=1; i<= 99; i++)
{
char fileNameTmp[__STRLEN__+16+255];
sprintf(fileNameTmp,"%s%s%d.txt",dir,fileName,i);
if(!fichierExistant(fileNameTmp))
{
FILE * f = fopen(fileNameTmp,"w");
if(f==NULL)
{
printf("Erreur lors de l'ouverture du fichier");
return creerFichier(date, client);
}
else
return f;
}
}
return NULL;
}
Bool fichierExistant(char * filename)
{
FILE * f = fopen(filename, "r");
fclose(f);
if(f==NULL)
return FALSE;
else
return TRUE;
}
void sauvergarderFacture(FILE * file, Date * date, Client * client)
{
int i;
float prixTot = 0;
fprintf(file,"La Bulle Informatique\nRoute du Condroz 78, 4123 Neupre\n");
fprintf(file,"\nFacture a payer\n");
fprintf(file,"Date de facturation :");
fprintf(file,"%02d/%02d/%02d", date->jour, date->moi, date->annee);
fprintf(file, "\n Info client :");
sauvegarderClientTXT(client, file, 1,ageClient(client,date));
fprintf(file,"\n|---------------------------------------------------------------------------------------------|\
\n| Designation | prixHTVA | Quantite | 10%% | prixTVAC |\
\n|---------------------------------------------------------------------------------------------|");
for(i=0;client->panier.nbrArt>i;i++)
{
fprintf(file,"\n|%34s|%12.2f Eur |%14d| %c |%12.2f |",\
client->panier.article[i].deisgnation,client->panier.article[i].prixHTVA,client->panier.article[i].quant\
,(client->panier.article[i].quant>=20)?'x':' ',\
(client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant);
prixTot += (client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant;
}
fprintf(file,"\n|---------------------------------------------------------------------------------------------|");
fprintf(file,"\nPrix totale :%f", prixTot);
fprintf(file, "\nPoints de fidelite aqui : %d\n", client->fidelite);
}
void afficherFacture(Date * date, Client * client)
{
int i;
float prixTot = 0;
printf("La Bulle Informatique\nRoute du Condroz 78, 4123 Neupre\n");
printf("\nFacture a payer\n");
printf("Date de facturation :");
printf("%02d/%02d/%02d", date->jour, date->moi, date->annee);
printf("\n Info client :");
afficherClient(client, date);
printf("\n|---------------------------------------------------------------------------------------------|\
\n| Designation | prixHTVA | Quantite | 10%% | prixTVAC |\
\n|---------------------------------------------------------------------------------------------|");
for(i=0;client->panier.nbrArt>i;i++)
{
printf("\n|%34s|%12.2f Eur |%14d| %c |%12.2f |",\
client->panier.article[i].deisgnation,client->panier.article[i].prixHTVA,client->panier.article[i].quant\
,(client->panier.article[i].quant>=20)?'x':' ',\
(client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant);
prixTot += (client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant;
}
printf("\n|---------------------------------------------------------------------------------------------|");
client->fidelite = pointsFidelite(prixTot);
printf("\nPrix totale :%f", prixTot);
printf("\nPoints de fidelite aqui : %d\n", client->fidelite);
}
void cleanFgets(char * str)
{
char *p = strchr(str, '\n');
if(p!=NULL)
*p = '\0';
else
{
printf("Une erreur est arrivé lors du nettoygae \\0");
exit(-1);
}
}
Bool clean_keyboard()
{
fflush(stdin);
// char c;
//while ((c = getchar()) != '\n' && c != EOF) { }
/* do {
c = getc(stdin);
printf("%c\n", c);
} while (c != '\n' && c != EOF);*/
return 1;
}
int ageClient(Client * client, Date * date)
{
if((date->moi == client->anniversaire.moi && date->jour >= client->anniversaire.jour) || (date->moi > client->anniversaire.moi))//anniversaire passé
{
return (date->annee - client->anniversaire.annee);
}
else
return (date->annee - client->anniversaire.annee - 1);
}
int pointsFidelite(float prix)
{
return (int)(prix/10);
}
void gestionFacture(Client * client, Date * date)
{
FILE * file;
printf("%d/%d/%d\n", date->jour, date->moi, date->annee );
file = creerFichier(date, client);
client->panier.article = (Article *)malloc(sizeof(Article));
client->panier.nbrArt = 1;
if(client->panier.article == NULL)
{
printf("ERREUR ALLOCATION ARTICLE!");
free(client->panier.article);
exit(-1);
}
encoderFacture(&client->panier);
afficherFacture(date, client);
sauvergarderFacture(file, date, client);
getch();
fclose(file);
free(client->panier.article);
}
long int rechercheClient(char *nom, char *prenom, FILE * clientDatF, Client * client, Date * date)
{
long int ofsetFileCurClient;
int t;
fseek(clientDatF, sizeof(unsigned long int)+sizeof(Bool), SEEK_SET);
clearerr(clientDatF); //Clear EOF
do
{
ofsetFileCurClient = ftell(clientDatF);
fread(client, sizeof(Client), 1, clientDatF);
t = compNP(client->nom, client->prenom, nom, prenom);
}while(!feof(clientDatF) && t);
if(feof(clientDatF))
{
client = NULL;
return NULL;
}
else
return ofsetFileCurClient;
}
Bool gestionClient(Client * client, Date * date, FILE * clientDatF, FILE * clientTXTF)
{
char choix;
while(1)
{
do
{
printf("A. Donnees client\n");
printf("B. Modification client\n");//acce au file *
printf("C. Facture\n");
printf("D. Retour\n");
printf("E. Quitter");
clean_keyboard();scanf("%c", &choix);
choix |= 0b00100000;
}while(!(choix == 'a' || choix == 'b' || choix == 'c' || choix == 'd' || choix == 'e'));
switch (choix) {
case 'a':
afficherClient(client, date);
break;
case 'b':
modificationClient(client, clientDatF, clientTXTF);
break;
case 'c':
gestionFacture(client, date);
break;
case 'd':
sauvegarderClientFile(clientTXTF, clientDatF, client);
return 1;
break;
case 'e':
sauvegarderClientFile(clientTXTF, clientDatF, client);
return 0;
break;
}
}
}
void localiserFichiersClients(char * fichierClientDat, FILE ** clientDatF, FILE ** clientTXTF)
{
char rep[__STRLEN_FILE__];
char repTmp[2][__STRLEN_FILE__];
unsigned long int nbClients = 0;
Bool tri = 0;
printf("Repertoir ou se trouve le fichier client.dat et client.txt");
clean_keyboard();
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
{
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))
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);
}
else
localiserFichiersClients(fichierClientDat, clientDatF, clientTXTF);
}
else
{
fclose(*clientDatF);
fclose(*clientTXTF);
}
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)
{
printf("\nErreur ouverture fichier");
localiserFichiersClients(fichierClientDat, clientDatF, clientTXTF);
}
}
int sauvegarderClientFile(FILE * clientTXTF, FILE * clientDatF, 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);
fread(&nbrClient,sizeof(nbrClient),1,clientDatF);
nbrClient++;
fseek(clientDatF, 0, SEEK_SET);
fwrite(&nbrClient,sizeof(nbrClient),1,clientDatF);
fseek(clientDatF, 0, SEEK_END);
fseek(clientTXTF, 0, SEEK_END);
client->ofsetFichierDat = ftell(clientDatF);
client->ofsetFichierTXT = ftell(clientTXTF);
sauvegarderClientTXT(client, clientTXTF, 0);
fflush(clientTXTF);
}
else
fseek(clientDatF, client->ofsetFichierDat, SEEK_SET);
fwrite(client, sizeof(Client), 1, clientDatF);
fflush(clientDatF);
return client->ofsetFichierDat;
}
int compNP(char *nom1, char *prenom1,char *nom2, char *prenom2)
{
unsigned int strLen1, strLen2;
char * tmp;
for(strLen1 = 0, tmp = nom1;*tmp++;strLen1++);
for(tmp = prenom1;*tmp++;strLen1++);
for(strLen2 = 0, tmp = nom2;*tmp++;strLen2++);
for(tmp = prenom2;*tmp++;strLen2++);
char * np1 = malloc(strLen1+1);
char * np2 = malloc(strLen2+1);
int renvois=0;
sprintf(np1,"%s%s", nom1, prenom1);
sprintf(np2,"%s%s", nom2, prenom2);
renvois = strcmp(np1,np2);
if(renvois>0)
renvois = 1;
else if(renvois<0)
renvois = -1;
free(np1);free(np2);
return renvois;
}
void clientBinToTXT(FILE * bin, FILE* txt)/*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))
{
if(fread(&client, sizeof(Client), 1,bin))
sauvegarderClientTXT(&client, txt, 0);
}
fflush(txt);
// fread()
}
void modificationClient(Client * client, FILE * clientDatF, FILE * clientTXTF)
{
char choix = 0;
void * aModifier[] = {(Adresse *)&client->adresse, (char *)&client->contact.telephone, (char *)&client->contact.email};
char * aAfficher[] = {"Adresse", "Telephne", "E-mail"};
do
{
do
{
system("cls");
if(choix)
printf("Erreur choix errone !\n");
printf("MODIFICATION CLIENT %s %s \n", client->nom, client->prenom);
printf("1. Adresse\n2. Telephne\n3. E-mail\n");
printf("Votre choix :");clean_keyboard();scanf("%d", (int *)&choix);
}while(!(choix == 1 || choix == 2 || choix == 3));
printf("Modification %s :", aAfficher[choix-1]);
if(choix == 1)
{
if(!(printf("Entrez la rue :") && clean_keyboard() && fgets(client->adresse.rue,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le numero :" ) && clean_keyboard() && fgets(client->adresse.numero,__STRLEN__,stdin) != NULL && \
printf("\nEntrez la localité :") && clean_keyboard() && fgets(client->adresse.localite,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le code postal :") && clean_keyboard() && scanf("%d", &(client->adresse.codePostal))))
{
printf("\nErreur lors de l'encodage de l'adresse");
exit(-1);
}
cleanFgets(client->adresse.rue);cleanFgets(client->adresse.numero);cleanFgets(client->adresse.localite);
}
else
{
clean_keyboard();
scanf("%s", (char *)aModifier[choix-1]);
}
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);
}

789
VANDAMME29.c Normal file
View File

@ -0,0 +1,789 @@
/*
* Fichier client :
*------------------------------------------------------------
*|UINTL NBClients|Bool Tri| Client 0 | Client 1 | .......ETc|
*------------------------------------------------------------
*NombreClients est stocké dans mon fichier
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <conio.h>
#include <sys/stat.h>
#include <time.h>
#include <string.h>
#include <stdarg.h>
#define __TVA__ 1.21
#define __REDUC__ 0.9
#define __MAXNBRART__ 3
#define __STRLEN__ 34
#define __STRLEN_FILE__ 500
#define __TAB_CLIENTDAT_FILE__ 0
#define __TAB_CLIENTTXT_FILE__ 1
typedef enum{FALSE,TRUE} Bool;
typedef struct {
char deisgnation[__STRLEN__];
float prixHTVA;
int quant;
} Article;
typedef struct {
Article * article;
unsigned int nbrArt;
} Panier;
typedef struct{
int jour,moi,annee;
} Date;
typedef struct{
char rue[__STRLEN__],numero[__STRLEN__],localite[__STRLEN__];
int codePostal;
} Adresse;
typedef struct{
char telephone[13],email[__STRLEN__];
} Contact;
typedef struct{
char nom[__STRLEN__];
char prenom[__STRLEN__];
Adresse adresse;
Contact contact;
Date anniversaire;
int fidelite;
Panier panier;
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
void encoderDate(Date *, char *);
Bool dateValide (Date *);
void encoderArticle(Article *);
void encoderClient(Client *);
void afficherClient(Client *, Date *);
void encoderFacture(Panier *);
void afficherFacture(Date *, Client *);
int pointsFidelite(float);
void gestionFacture(Client *, Date *);
void cleanFgets(char*);
int itoaY(int i, char*);
int itoaDM(int i, char*);
Bool clean_keyboard();
int ageClient(Client *, Date *);
long int rechercheClient(char *, char*, FichierClient *, Client *, Date *);
Bool gestionClient(Client *, Date *, FichierClient *);
int compNP(char *, char *,char *, char *);
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 *);
void sauvegarderClientTXT(Client *, FILE *, long,...); /*EcrireDonneesClient
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(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));
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__];
int choixMenu;
Date date;
char tmp;
Bool w;
time_t curTimeStamp = time(NULL);
struct tm *locTime = localtime(&curTimeStamp);
locTime->tm_mon += 1;
locTime->tm_year += 1900;
printf("Voulez-vous utilisez la date système %d/%d/%d (Y|n)?\n", locTime->tm_mday,locTime->tm_mon,locTime->tm_year);
scanf("%c", &tmp);
if((tmp|0b00100000) != 'y')
encoderDate(&date, "Date facturation");
else
{
date.jour = locTime->tm_mday;
date.moi = locTime->tm_mon;
date.annee = locTime->tm_year;
// printf("%d/%d/%d\n", date->jour, date->moi, date->annee );
}
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|3):");clean_keyboard();scanf("%d", &choixMenu);
}while(!(choixMenu<=3 && choixMenu>=1));
switch (choixMenu)
{
case 1:
client = (Client*)malloc(sizeof(Client));
client->ofsetFichierDat = 0;
client->ofsetFichierTXT = 0;
encoderClient(client);
afficherClient(client, &date);
fseek(fichierClient.txt, 0, SEEK_END);
sauvegarderClientFile(&fichierClient, client);
w = gestionClient(client, &date, &fichierClient);
nbrClient++;
free(client);
break;
case 2:
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, &fichierClient, client, &date);
if(ofsetFileCurClient)
{
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;
}
}
fclose(fichierClient.txt);
fclose(fichierClient.bin);
return 0;
}
void encoderDate(Date * date, char *invite)
{
do {
printf("\n%s\n", invite);
printf("Entrez la date sous cette forme : jj/mm/aaaa\n");
scanf("%d/%d/%d",&(date->jour),&(date->moi),&(date->annee));
} while(!dateValide(date));
}
Bool dateValide(Date * date)
{
int m = date->jour;
int d = date->moi;
int y = date->annee;
int daysinmonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))//Si bis février = 29
daysinmonth[1]=29;
if (m<13)
{
if( d <= daysinmonth[m-1] )
return 1;
else
return 0;
}
else
return 0;
}
void encoderArticle(Article * article)
{
printf("\nVeuillez entrer le nom : ");
clean_keyboard();
scanf("%34s", article->deisgnation);
printf("\nVeuillez entrer le prix a l'unite hors TVA : ");
clean_keyboard();
scanf("%f", &article->prixHTVA);
printf("\nVeuillez entrer la quantite desiree : ");
clean_keyboard();
scanf("%d", &article->quant);
}
void encoderClient(Client * client)
{
printf("\nEncoage Client\n");
client->fidelite = 0;
if(!(printf("Entrez la rue :") && clean_keyboard() && fgets(client->adresse.rue,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le numero :" ) && clean_keyboard() && fgets(client->adresse.numero,__STRLEN__,stdin) != NULL && \
printf("\nEntrez la localité :") && clean_keyboard() && fgets(client->adresse.localite,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le code postal :") && clean_keyboard() && scanf("%d", &(client->adresse.codePostal)) && \
printf("\nNom client :") && clean_keyboard() && fgets(client->nom,__STRLEN__,stdin) != NULL &&\
printf("\nPrenom client :") && clean_keyboard() && fgets(client->prenom,__STRLEN__,stdin) != NULL))
{
printf("\nErreur lors de l'encodage de l'adresse");
exit(-1);
}
cleanFgets(client->adresse.rue);cleanFgets(client->adresse.numero);cleanFgets(client->adresse.localite);
cleanFgets(client->nom);cleanFgets(client->prenom);
if(!(printf("\n Entrez le numéro de tél. :") && clean_keyboard() &&fgets(client->contact.telephone,13,stdin) && \
printf("\nEntrez l'adresse email :") && clean_keyboard() &&fgets(client->contact.email,__STRLEN__,stdin)))
{
printf("\nErreur lors de l'encodage des coo de contact");
exit(-1);
}
cleanFgets(client->contact.telephone);cleanFgets(client->contact.email);
encoderDate(&(client->anniversaire), "\nAnniversaire client:");
}
void afficherClient(Client *client, Date *date)
{
printf("\nClient : %s %s (%d)\n", client->nom, client->prenom, ageClient(client, date));
printf("rue : %s\n",client->adresse.rue);
printf("numero : %s\n",client->adresse.numero);
printf("localité : %s\n",client->adresse.localite);
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 acquis : %d\n", client->fidelite);
}
void sauvegarderClientTXT(Client *client, FILE * file, long arg, ...) //EcrireDonneesClient
{
va_list ap;
int age = 0;
va_start(ap, arg);
if(arg>1)
{
fseek(file, arg, SEEK_SET);
fprintf(file, "Client : %s %s", client->nom, client->prenom);
fprintf(file, "\n");
}
else if(arg == 1)
{
age = va_arg(ap,int);
fprintf(file, "Client : %s %s (%d)\n", client->nom, client->prenom,age);
}
else
{
fprintf(file, "Client : %s %s \n", client->nom, client->prenom);
}
fprintf(file, "rue : %s\n",client->adresse.rue);
fprintf(file, "numero : %s\n",client->adresse.numero);
fprintf(file, "localité : %s\n",client->adresse.localite);
fprintf(file, "code postal : %d\n",client->adresse.codePostal);
fprintf(file, "numéro de tél. : %s\n",client->contact.telephone);
fprintf(file, "adresse email : %s\n",client->contact.email);
if(arg == 1)
{
fprintf(file, "\nPoints de fidelite acquis : %d\n", client->fidelite);
}
else
{
fprintf(file, "\n===========================================================================\n");
}
va_end(ap);
}
void encoderFacture(Panier * panier)
{
char continuer = 'y';
do{
if(panier->nbrArt <= __MAXNBRART__)
{
encoderArticle(&(panier->article[panier->nbrArt-1]));
printf("Y-a-t-il encore un article ?(Y|n)");
clean_keyboard();
scanf("%c", &continuer);
if(panier->nbrArt < __MAXNBRART__ && (continuer|0b00100000) == 'y')
{
panier->nbrArt++;
Article * tempArticle;
tempArticle = (Article*)realloc(panier->article, sizeof(Article)*(panier->nbrArt));
if(panier->article == NULL)
{
printf("ERREUR ALLOCATION panier->article !");
free(tempArticle);
free(panier->article);
exit(-1);
}
else
{
panier->article = tempArticle;
}
}
else if((continuer|0b00100000) == 'y')
{
system("cls");
printf("Vous avez ateint le nombre d'article maximum !\n\n");
break;
}
}
}while((continuer|0b00100000) == 'y' && panier->nbrArt <= __MAXNBRART__);
}
FILE * creerFichier(Date * date, Client * client)
{
char fileName[__STRLEN__+16];
fileName[0] = '\0';
char dir[__STRLEN__];
int i;
printf("Dossier d'enregistrement : ");
clean_keyboard();
scanf("%s", dir);
sprintf(fileName, "%s%d%d%d_", client->nom, date->annee, date->moi, date->jour);
for(i=1; i<= 99; i++)
{
char fileNameTmp[__STRLEN__+16+255];
sprintf(fileNameTmp,"%s%s%d.txt",dir,fileName,i);
if(!fichierExistant(fileNameTmp))
{
FILE * f = fopen(fileNameTmp,"w");
if(f==NULL)
{
printf("Erreur lors de l'ouverture du fichier");
return creerFichier(date, client);
}
else
return f;
}
}
return NULL;
}
Bool fichierExistant(char * filename)
{
FILE * f = fopen(filename, "r");
fclose(f);
if(f==NULL)
return FALSE;
else
return TRUE;
}
void sauvergarderFacture(FILE * file, Date * date, Client * client)
{
int i;
float prixTot = 0;
fprintf(file,"La Bulle Informatique\nRoute du Condroz 78, 4123 Neupre\n");
fprintf(file,"\nFacture a payer\n");
fprintf(file,"Date de facturation :");
fprintf(file,"%02d/%02d/%02d", date->jour, date->moi, date->annee);
fprintf(file, "\n Info client :");
sauvegarderClientTXT(client, file, 1,ageClient(client,date));
fprintf(file,"\n|---------------------------------------------------------------------------------------------|\
\n| Designation | prixHTVA | Quantite | 10%% | prixTVAC |\
\n|---------------------------------------------------------------------------------------------|");
for(i=0;client->panier.nbrArt>i;i++)
{
fprintf(file,"\n|%34s|%12.2f Eur |%14d| %c |%12.2f |",\
client->panier.article[i].deisgnation,client->panier.article[i].prixHTVA,client->panier.article[i].quant\
,(client->panier.article[i].quant>=20)?'x':' ',\
(client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant);
prixTot += (client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant;
}
fprintf(file,"\n|---------------------------------------------------------------------------------------------|");
fprintf(file,"\nPrix totale :%f", prixTot);
fprintf(file, "\nPoints de fidelite acquis : %d\n", client->fidelite);
}
void afficherFacture(Date * date, Client * client)
{
int i;
float prixTot = 0;
printf("La Bulle Informatique\nRoute du Condroz 78, 4123 Neupre\n");
printf("\nFacture a payer\n");
printf("Date de facturation :");
printf("%02d/%02d/%02d", date->jour, date->moi, date->annee);
printf("\n Info client :");
afficherClient(client, date);
printf("\n|---------------------------------------------------------------------------------------------|\
\n| Designation | prixHTVA | Quantite | 10%% | prixTVAC |\
\n|---------------------------------------------------------------------------------------------|");
for(i=0;client->panier.nbrArt>i;i++)
{
printf("\n|%34s|%12.2f Eur |%14d| %c |%12.2f |",\
client->panier.article[i].deisgnation,client->panier.article[i].prixHTVA,client->panier.article[i].quant\
,(client->panier.article[i].quant>=20)?'x':' ',\
(client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant);
prixTot += (client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant;
}
printf("\n|---------------------------------------------------------------------------------------------|");
client->fidelite = pointsFidelite(prixTot);
printf("\nPrix totale :%f", prixTot);
printf("\nPoints de fidelite acquis : %d\n", client->fidelite);
}
void cleanFgets(char * str)
{
char *p = strchr(str, '\n');
if(p!=NULL)
*p = '\0';
else
{
printf("Une erreur est arrivé lors du nettoygae \\0");
exit(-1);
}
}
Bool clean_keyboard()
{
fflush(stdin);
// char c;
//while ((c = getchar()) != '\n' && c != EOF) { }
/* do {
c = getc(stdin);
printf("%c\n", c);
} while (c != '\n' && c != EOF);*/
return 1;
}
int ageClient(Client * client, Date * date)
{
if((date->moi == client->anniversaire.moi && date->jour >= client->anniversaire.jour) || (date->moi > client->anniversaire.moi))//anniversaire passé
{
return (date->annee - client->anniversaire.annee);
}
else
return (date->annee - client->anniversaire.annee - 1);
}
int pointsFidelite(float prix)
{
return (int)(prix/10);
}
void gestionFacture(Client * client, Date * date)
{
FILE * file;
printf("%d/%d/%d\n", date->jour, date->moi, date->annee );
file = creerFichier(date, client);
client->panier.article = (Article *)malloc(sizeof(Article));
client->panier.nbrArt = 1;
if(client->panier.article == NULL)
{
printf("ERREUR ALLOCATION ARTICLE!");
free(client->panier.article);
exit(-1);
}
encoderFacture(&client->panier);
afficherFacture(date, client);
sauvergarderFacture(file, date, client);
getch();
fclose(file);
free(client->panier.article);
}
long int rechercheClient(char *nom, char *prenom, FichierClient *fichierClient,Client * client, Date * date)
{
long int ofsetFileCurClient;
int t;
fseek(fichierClient->bin, sizeof(unsigned long int)+sizeof(Bool), SEEK_SET);
clearerr(fichierClient->bin); //Clear EOF
do
{
ofsetFileCurClient = ftell(fichierClient->bin);
fread(client, sizeof(Client), 1, fichierClient->bin);
t = compNP(client->nom, client->prenom, nom, prenom);
}while(!feof(fichierClient->bin) && t);
if(feof(fichierClient->bin))
{
client = NULL;
return 0;
}
else
return ofsetFileCurClient;
}
Bool gestionClient(Client * client, Date * date, FichierClient *fichierClient)
{
char choix;
while(1)
{
do
{
printf("A. Donnees client\n");
printf("B. Modification client\n");//acce au file *
printf("C. Facture\n");
printf("D. Retour\n");
printf("E. Quitter");
clean_keyboard();scanf("%c", &choix);
choix |= 0b00100000;
}while(!(choix == 'a' || choix == 'b' || choix == 'c' || choix == 'd' || choix == 'e'));
switch (choix) {
case 'a':
afficherClient(client, date);
break;
case 'b':
modificationClient(client, fichierClient);
break;
case 'c':
gestionFacture(client, date);
break;
case 'd':
sauvegarderClientFile(fichierClient, client);
return 1;
break;
case 'e':
sauvegarderClientFile(fichierClient, client);
return 0;
break;
}
}
}
void localiserFichiersClients(FichierClient *fichierClient)
{
char rep[__STRLEN_FILE__];
char repTmp[2][__STRLEN_FILE__];
unsigned long int nbClients = 0;
Bool tri = 0;
printf("Repertoir ou se trouve le fichier client.dat et client.txt");
clean_keyboard();
scanf("%s", rep);
sprintf(repTmp[__TAB_CLIENTDAT_FILE__],"%sclients.dat", rep);
sprintf(repTmp[__TAB_CLIENTTXT_FILE__],"%sclients.txt", rep);
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(!(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(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(fichierClient);
}
else
{
fclose(fichierClient->bin);
fclose(fichierClient->txt);
}
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(fichierClient);
}
}
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(fichierClient->bin, 0, SEEK_SET);
fread(&nbrClient,sizeof(nbrClient),1,fichierClient->bin);
nbrClient++;
fseek(fichierClient->bin, 0, SEEK_SET);
fwrite(&nbrClient,sizeof(nbrClient),1,fichierClient->bin);
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(fichierClient->bin, client->ofsetFichierDat, SEEK_SET);
fwrite(client, sizeof(Client), 1, fichierClient->bin);
fflush(fichierClient->bin);
return client->ofsetFichierDat;
}
int compNP(char *nom1, char *prenom1,char *nom2, char *prenom2)
{
unsigned int strLen1, strLen2;
char * tmp;
for(strLen1 = 0, tmp = nom1;*tmp++;strLen1++);
for(tmp = prenom1;*tmp++;strLen1++);
for(strLen2 = 0, tmp = nom2;*tmp++;strLen2++);
for(tmp = prenom2;*tmp++;strLen2++);
char * np1 = malloc(strLen1+1);
char * np2 = malloc(strLen2+1);
int renvois=0;
sprintf(np1,"%s%s", nom1, prenom1);
sprintf(np2,"%s%s", nom2, prenom2);
renvois = strcmp(np1,np2);
if(renvois>0)
renvois = 1;
else if(renvois<0)
renvois = -1;
free(np1);free(np2);
return renvois;
}
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(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,fichierClient->bin))
sauvegarderClientTXT(&client, fichierClient->txt, 0);
}
fflush(fichierClient->txt);
// fread()
}
void modificationClient(Client * client, FichierClient * fichierClient)
{
char choix = 0;
void * aModifier[] = {(Adresse *)&client->adresse, (char *)&client->contact.telephone, (char *)&client->contact.email};
char * aAfficher[] = {"Adresse", "Telephne", "E-mail"};
do
{
do
{
system("cls");
if(choix)
printf("Erreur choix errone !\n");
printf("MODIFICATION CLIENT %s %s \n", client->nom, client->prenom);
printf("1. Adresse\n2. Telephne\n3. E-mail\n");
printf("Votre choix :");clean_keyboard();scanf("%d", (int *)&choix);
}while(!(choix == 1 || choix == 2 || choix == 3));
printf("Modification %s :", aAfficher[choix-1]);
if(choix == 1)
{
if(!(printf("Entrez la rue :") && clean_keyboard() && fgets(client->adresse.rue,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le numero :" ) && clean_keyboard() && fgets(client->adresse.numero,__STRLEN__,stdin) != NULL && \
printf("\nEntrez la localité :") && clean_keyboard() && fgets(client->adresse.localite,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le code postal :") && clean_keyboard() && scanf("%d", &(client->adresse.codePostal))))
{
printf("\nErreur lors de l'encodage de l'adresse");
exit(-1);
}
cleanFgets(client->adresse.rue);cleanFgets(client->adresse.numero);cleanFgets(client->adresse.localite);
}
else
{
clean_keyboard();
scanf("%s", (char *)aModifier[choix-1]);
}
printf("Y-a-til encore des Modification (y|n) ?");
clean_keyboard();scanf("%c", &choix);
}while((choix|0b00100000) == 'y');
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; i<nbrClients && !feof(fichierClient->bin); 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);
}
}

970
VANDAMME30.c Normal file
View File

@ -0,0 +1,970 @@
/*
* Fichier client :
*------------------------------------------------------------
*|UINTL NBClients|Bool Tri| Client 0 | Client 1 | .......ETc|
*------------------------------------------------------------
*NombreClients est stocké dans mon fichier
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <conio.h>
#include <sys/stat.h>
#include <time.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#define __TVA__ 1.21
#define __REDUC__ 0.9
#define __MAXNBRART__ 3
#define __STRLEN__ 34
#define __STRLEN_FILE__ 500
#define __TAB_CLIENTDAT_FILE__ 0
#define __TAB_CLIENTTXT_FILE__ 1
typedef enum{FALSE=0,TRUE=1} Bool;
typedef struct {
char deisgnation[__STRLEN__];
float prixHTVA;
int quant;
} Article;
typedef struct {
Article * article;
unsigned int nbrArt;
} Panier;
typedef struct{
int jour,moi,annee;
} Date;
typedef struct{
char rue[__STRLEN__],numero[__STRLEN__],localite[__STRLEN__];
int codePostal;
} Adresse;
typedef struct{
char telephone[13],email[__STRLEN__];
} Contact;
typedef struct{
char nom[__STRLEN__];
char prenom[__STRLEN__];
Adresse adresse;
Contact contact;
Date anniversaire;
int fidelite;
Panier panier;
long ofsetFichierDat;
long ofsetFichierTXT;
} Client;
typedef struct{
FILE * bin;
FILE * txt;
char emplacementBin[__STRLEN_FILE__];
char emplacementTXT[__STRLEN_FILE__];
Bool tri;
} FichierClient; // En cours de modif, sera utiliser dans les futur version
void encoderDate(Date *, char *);
Bool dateValide (Date *);
void encoderArticle(Article *);
void encoderClient(Client *);
void afficherClient(Client *, Date *);
void encoderFacture(Panier *);
void afficherFacture(Date *, Client *);
int pointsFidelite(float);
void gestionFacture(Client *, Date *);
void cleanFgets(char*);
int itoaY(int i, char*);
int itoaDM(int i, char*);
Bool clean_keyboard();
int ageClient(Client *, Date *);
long int rechercheClient(char *, char*, FichierClient *, Client *, Date *);
Bool gestionClient(Client *, Date *, FichierClient *);
int compNP(char *, char *,char *, char *);
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 *);
void sauvegarderClientTXT(Client *, FILE *, long,...); /*EcrireDonneesClient
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(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 **);
void qSortClientBinByNP(Client **);
void sauvegarderTabClientFile(FichierClient *, Client **);
void insertClientTabTrier(Client * client, Client *** clientTab);
void setTriFlagFile(FichierClient*);
void unsetTriFlagFile(FichierClient*);
int main()
{
//printf("%d\n", pointsFidelite(52.23));
FichierClient fichierClient = {NULL, NULL, "", "", 0};
Client * client;
Client ** clientTab = NULL;
client = (Client*)malloc(sizeof(Client));
long int ofsetFileCurClient = 0;
unsigned long int nbrClient = 0, idClient = 0;
if(ofsetFileCurClient);//Pour ne pas avoir de warn
char nomClient[__STRLEN__],prenomClient[__STRLEN__];
int choixMenu;
Date date;
char tmp;
Bool w;
time_t curTimeStamp = time(NULL);
struct tm *locTime = localtime(&curTimeStamp);
locTime->tm_mon += 1;
locTime->tm_year += 1900;
printf("Voulez-vous utilisez la date système %d/%d/%d (Y|n)?\n", locTime->tm_mday,locTime->tm_mon,locTime->tm_year);
scanf("%c", &tmp);
if((tmp|0b00100000) != 'y')
encoderDate(&date, "Date facturation");
else
{
date.jour = locTime->tm_mday;
date.moi = locTime->tm_mon;
date.annee = locTime->tm_year;
// printf("%d/%d/%d\n", date->jour, date->moi, date->annee );
}
localiserFichiersClients(&fichierClient);
nbrClient = nombreClients(&fichierClient);
recupererClients(&fichierClient, &clientTab);
while(w)
{
printf("1. Nouveau client\n");
printf("2. Client enregistré\n");
printf("3. Liste des client\n");
printf("4. Tri des client\n");
do{
printf("Choix (1|2|3|4):");clean_keyboard();scanf("%d", &choixMenu);
}while(!(choixMenu<=4 && choixMenu>=1));
switch (choixMenu)
{
case 1:
client->ofsetFichierDat = 0;
client->ofsetFichierTXT = 0;
encoderClient(client);
afficherClient(client, &date);
fseek(fichierClient.txt, 0, SEEK_END);
insertClientTabTrier(client, &clientTab);
sauvegarderTabClientFile(&fichierClient, clientTab);
w = gestionClient(client, &date, &fichierClient);
nbrClient++;
break;
case 2:
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, &fichierClient, client, &date);
if(ofsetFileCurClient)
{
w = gestionClient(client, &date, &fichierClient);
}
else
{
printf("\nClient non trouvé !\n");
}
break;
case 3:
printf("0 : Retour\n");
afficherListeClients(clientTab);
do {
printf("Entrez l'id du client :"); clean_keyboard();scanf("%lu", &idClient);
} while(idClient > nbrClient);
if(idClient != 0)
{
client = *(clientTab+(idClient-1));
w = gestionClient(client, &date, &fichierClient);
}
break;
case 4:
printf("Avent\n");
afficherListeClients(clientTab);
printf("\n\nApres\n");
qSortClientBinByNP(clientTab);
afficherListeClients(clientTab);
sauvegarderTabClientFile(&fichierClient, clientTab);
break;
}
}
while(*clientTab)
free(*clientTab++);
free(clientTab);
free(client);
fclose(fichierClient.txt);
fclose(fichierClient.bin);
return 0;
}
void encoderDate(Date * date, char *invite)
{
do {
printf("\n%s\n", invite);
printf("Entrez la date sous cette forme : jj/mm/aaaa\n");
scanf("%d/%d/%d",&(date->jour),&(date->moi),&(date->annee));
} while(!dateValide(date));
}
Bool dateValide(Date * date)
{
int m = date->jour;
int d = date->moi;
int y = date->annee;
int daysinmonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))//Si bis février = 29
daysinmonth[1]=29;
if (m<13)
{
if( d <= daysinmonth[m-1] )
return 1;
else
return 0;
}
else
return 0;
}
void encoderArticle(Article * article)
{
printf("\nVeuillez entrer le nom : ");
clean_keyboard();
scanf("%34s", article->deisgnation);
printf("\nVeuillez entrer le prix a l'unite hors TVA : ");
clean_keyboard();
scanf("%f", &article->prixHTVA);
printf("\nVeuillez entrer la quantite desiree : ");
clean_keyboard();
scanf("%d", &article->quant);
}
void encoderClient(Client * client)
{
printf("\nEncoage Client\n");
client->fidelite = 0;
if(!(printf("Entrez la rue :") && clean_keyboard() && fgets(client->adresse.rue,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le numero :" ) && clean_keyboard() && fgets(client->adresse.numero,__STRLEN__,stdin) != NULL && \
printf("\nEntrez la localité :") && clean_keyboard() && fgets(client->adresse.localite,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le code postal :") && clean_keyboard() && scanf("%d", &(client->adresse.codePostal)) && \
printf("\nNom client :") && clean_keyboard() && fgets(client->nom,__STRLEN__,stdin) != NULL &&\
printf("\nPrenom client :") && clean_keyboard() && fgets(client->prenom,__STRLEN__,stdin) != NULL))
{
printf("\nErreur lors de l'encodage de l'adresse");
exit(-1);
}
cleanFgets(client->adresse.rue);cleanFgets(client->adresse.numero);cleanFgets(client->adresse.localite);
cleanFgets(client->nom);cleanFgets(client->prenom);
if(!(printf("\n Entrez le numéro de tél. :") && clean_keyboard() &&fgets(client->contact.telephone,13,stdin) && \
printf("\nEntrez l'adresse email :") && clean_keyboard() &&fgets(client->contact.email,__STRLEN__,stdin)))
{
printf("\nErreur lors de l'encodage des coo de contact");
exit(-1);
}
cleanFgets(client->contact.telephone);cleanFgets(client->contact.email);
encoderDate(&(client->anniversaire), "\nAnniversaire client:");
}
void afficherClient(Client *client, Date *date)
{
printf("\nClient : %s %s (%d)\n", client->nom, client->prenom, ageClient(client, date));
printf("rue : %s\n",client->adresse.rue);
printf("numero : %s\n",client->adresse.numero);
printf("localité : %s\n",client->adresse.localite);
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 acquis : %d\n", client->fidelite);
}
void sauvegarderClientTXT(Client *client, FILE * file, long arg, ...) //EcrireDonneesClient
{
va_list ap;
int age = 0;
va_start(ap, arg);
if(arg>1)
{
fseek(file, arg, SEEK_SET);
fprintf(file, "Client : %s %s", client->nom, client->prenom);
fprintf(file, "\n");
}
else if(arg == 1)
{
age = va_arg(ap,int);
fprintf(file, "Client : %s %s (%d)\n", client->nom, client->prenom,age);
}
else
{
fprintf(file, "Client : %s %s \n", client->nom, client->prenom);
}
fprintf(file, "rue : %s\n",client->adresse.rue);
fprintf(file, "numero : %s\n",client->adresse.numero);
fprintf(file, "localité : %s\n",client->adresse.localite);
fprintf(file, "code postal : %d\n",client->adresse.codePostal);
fprintf(file, "numéro de tél. : %s\n",client->contact.telephone);
fprintf(file, "adresse email : %s\n",client->contact.email);
if(arg == 1)
{
fprintf(file, "\nPoints de fidelite acquis : %d\n", client->fidelite);
}
else
{
fprintf(file, "\n===========================================================================\n");
}
va_end(ap);
}
void encoderFacture(Panier * panier)
{
char continuer = 'y';
do{
if(panier->nbrArt <= __MAXNBRART__)
{
encoderArticle(&(panier->article[panier->nbrArt-1]));
printf("Y-a-t-il encore un article ?(Y|n)");
clean_keyboard();
scanf("%c", &continuer);
if(panier->nbrArt < __MAXNBRART__ && (continuer|0b00100000) == 'y')
{
panier->nbrArt++;
Article * tempArticle;
tempArticle = (Article*)realloc(panier->article, sizeof(Article)*(panier->nbrArt));
if(panier->article == NULL)
{
printf("ERREUR ALLOCATION panier->article !");
free(tempArticle);
free(panier->article);
exit(-1);
}
else
{
panier->article = tempArticle;
}
}
else if((continuer|0b00100000) == 'y')
{
system("cls");
printf("Vous avez ateint le nombre d'article maximum !\n\n");
break;
}
}
}while((continuer|0b00100000) == 'y' && panier->nbrArt <= __MAXNBRART__);
}
FILE * creerFichier(Date * date, Client * client)
{
char fileName[__STRLEN__+16];
fileName[0] = '\0';
char dir[__STRLEN__];
int i;
printf("Dossier d'enregistrement : ");
clean_keyboard();
scanf("%s", dir);
sprintf(fileName, "%s%d%d%d_", client->nom, date->annee, date->moi, date->jour);
for(i=1; i<= 99; i++)
{
char fileNameTmp[__STRLEN__+16+255];
sprintf(fileNameTmp,"%s%s%d.txt",dir,fileName,i);
if(!fichierExistant(fileNameTmp))
{
FILE * f = fopen(fileNameTmp,"w");
if(f==NULL)
{
printf("Erreur lors de l'ouverture du fichier");
return creerFichier(date, client);
}
else
return f;
}
}
return NULL;
}
Bool fichierExistant(char * filename)
{
FILE * f = fopen(filename, "r");
fclose(f);
if(f==NULL)
return FALSE;
else
return TRUE;
}
void sauvergarderFacture(FILE * file, Date * date, Client * client)
{
int i;
float prixTot = 0;
fprintf(file,"La Bulle Informatique\nRoute du Condroz 78, 4123 Neupre\n");
fprintf(file,"\nFacture a payer\n");
fprintf(file,"Date de facturation :");
fprintf(file,"%02d/%02d/%02d", date->jour, date->moi, date->annee);
fprintf(file, "\n Info client :");
sauvegarderClientTXT(client, file, 1,ageClient(client,date));
fprintf(file,"\n|---------------------------------------------------------------------------------------------|\
\n| Designation | prixHTVA | Quantite | 10%% | prixTVAC |\
\n|---------------------------------------------------------------------------------------------|");
for(i=0;client->panier.nbrArt>i;i++)
{
fprintf(file,"\n|%34s|%12.2f Eur |%14d| %c |%12.2f |",\
client->panier.article[i].deisgnation,client->panier.article[i].prixHTVA,client->panier.article[i].quant\
,(client->panier.article[i].quant>=20)?'x':' ',\
(client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant);
prixTot += (client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant;
}
fprintf(file,"\n|---------------------------------------------------------------------------------------------|");
fprintf(file,"\nPrix totale :%f", prixTot);
fprintf(file, "\nPoints de fidelite acquis : %d\n", client->fidelite);
}
void afficherFacture(Date * date, Client * client)
{
int i;
float prixTot = 0;
printf("La Bulle Informatique\nRoute du Condroz 78, 4123 Neupre\n");
printf("\nFacture a payer\n");
printf("Date de facturation :");
printf("%02d/%02d/%02d", date->jour, date->moi, date->annee);
printf("\n Info client :");
afficherClient(client, date);
printf("\n|---------------------------------------------------------------------------------------------|\
\n| Designation | prixHTVA | Quantite | 10%% | prixTVAC |\
\n|---------------------------------------------------------------------------------------------|");
for(i=0;client->panier.nbrArt>i;i++)
{
printf("\n|%34s|%12.2f Eur |%14d| %c |%12.2f |",\
client->panier.article[i].deisgnation,client->panier.article[i].prixHTVA,client->panier.article[i].quant\
,(client->panier.article[i].quant>=20)?'x':' ',\
(client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant);
prixTot += (client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant;
}
printf("\n|---------------------------------------------------------------------------------------------|");
client->fidelite = pointsFidelite(prixTot);
printf("\nPrix totale :%f", prixTot);
printf("\nPoints de fidelite acquis : %d\n", client->fidelite);
}
void cleanFgets(char * str)
{
char *p = strchr(str, '\n');
if(p!=NULL)
*p = '\0';
else
{
printf("Une erreur est arrivé lors du nettoygae \\0");
exit(-1);
}
}
Bool clean_keyboard()
{
fflush(stdin);
// char c;
//while ((c = getchar()) != '\n' && c != EOF) { }
/* do {
c = getc(stdin);
printf("%c\n", c);
} while (c != '\n' && c != EOF);*/
return 1;
}
int ageClient(Client * client, Date * date)
{
if((date->moi == client->anniversaire.moi && date->jour >= client->anniversaire.jour) || (date->moi > client->anniversaire.moi))//anniversaire passé
{
return (date->annee - client->anniversaire.annee);
}
else
return (date->annee - client->anniversaire.annee - 1);
}
int pointsFidelite(float prix)
{
return (int)(prix/10);
}
void gestionFacture(Client * client, Date * date)
{
FILE * file;
printf("%d/%d/%d\n", date->jour, date->moi, date->annee );
file = creerFichier(date, client);
client->panier.article = (Article *)malloc(sizeof(Article));
client->panier.nbrArt = 1;
if(client->panier.article == NULL)
{
printf("ERREUR ALLOCATION ARTICLE!");
free(client->panier.article);
exit(-1);
}
encoderFacture(&client->panier);
afficherFacture(date, client);
sauvergarderFacture(file, date, client);
getch();
fclose(file);
free(client->panier.article);
}
long int rechercheClient(char *nom, char *prenom, FichierClient *fichierClient,Client * client, Date * date)
{
long int ofsetFileCurClient;
int t;
fseek(fichierClient->bin, sizeof(unsigned long int)+sizeof(Bool), SEEK_SET);
clearerr(fichierClient->bin); //Clear EOF
do
{
ofsetFileCurClient = ftell(fichierClient->bin);
fread(client, sizeof(Client), 1, fichierClient->bin);
t = compNP(client->nom, client->prenom, nom, prenom);
}while(!feof(fichierClient->bin) && t);
if(feof(fichierClient->bin))
{
client = NULL;
return 0;
}
else
return ofsetFileCurClient;
}
Bool gestionClient(Client * client, Date * date, FichierClient *fichierClient)
{
char choix;
while(1)
{
do
{
printf("A. Donnees client\n");
printf("B. Modification client\n");//acce au file *
printf("C. Facture\n");
printf("D. Retour\n");
printf("E. Quitter");
clean_keyboard();scanf("%c", &choix);
choix |= 0b00100000;
}while(!(choix == 'a' || choix == 'b' || choix == 'c' || choix == 'd' || choix == 'e'));
switch (choix) {
case 'a':
afficherClient(client, date);
break;
case 'b':
modificationClient(client, fichierClient);
break;
case 'c':
gestionFacture(client, date);
break;
case 'd':
sauvegarderClientFile(fichierClient, client);
return 1;
break;
case 'e':
sauvegarderClientFile(fichierClient, client);
return 0;
break;
}
}
}
void localiserFichiersClients(FichierClient *fichierClient)
{
char rep[__STRLEN_FILE__];
char repTmp[2][__STRLEN_FILE__];
unsigned long int nbClients = 0;
Bool tri = 0;
printf("Repertoir ou se trouve le fichier client.dat et client.txt");
clean_keyboard();
scanf("%s", rep);
sprintf(repTmp[__TAB_CLIENTDAT_FILE__],"%sclients.dat", rep);
sprintf(repTmp[__TAB_CLIENTTXT_FILE__],"%sclients.txt", rep);
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(!(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')
{
tri = 1; //Il est vide, donc je considère qu'il est trier
fichierClient->tri = 1;
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(fichierClient);
}
else
{
fclose(fichierClient->bin);
fclose(fichierClient->txt);
}
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(fichierClient);
}
}
int sauvegarderClientFile(FichierClient *fichierClient, Client * client)
{
/* Si Nouveau client ofsetFichierDat = 0 donc nouveau client sinon on decale de l'ofset */
if(!client->ofsetFichierDat)
{
unsetTriFlagFile(fichierClient); //On le met a la fin donc non trier
unsigned long int nbrClient;
fseek(fichierClient->bin, 0, SEEK_SET);
fread(&nbrClient,sizeof(nbrClient),1,fichierClient->bin);
nbrClient++;
fseek(fichierClient->bin, 0, SEEK_SET);
fwrite(&nbrClient,sizeof(nbrClient),1,fichierClient->bin);
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(fichierClient->bin, client->ofsetFichierDat, SEEK_SET);
fwrite(client, sizeof(Client), 1, fichierClient->bin);
fflush(fichierClient->bin);
return client->ofsetFichierDat;
}
int compNP(char *nom1, char *prenom1,char *nom2, char *prenom2)
{
unsigned int strLen1, strLen2;
char * tmp;
for(strLen1 = 0, tmp = nom1;*tmp++;strLen1++);
for(tmp = prenom1;*tmp++;strLen1++);
for(strLen2 = 0, tmp = nom2;*tmp++;strLen2++);
for(tmp = prenom2;*tmp++;strLen2++);
char * np1 = malloc(strLen1+1);
char * np2 = malloc(strLen2+1);
int renvois=0;
sprintf(np1,"%s%s", nom1, prenom1);
sprintf(np2,"%s%s", nom2, prenom2);
renvois = strcmp(np1,np2);
if(renvois>0)
renvois = 1;
else if(renvois<0)
renvois = -1;
free(np1);free(np2);
return renvois;
}
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(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,fichierClient->bin))
sauvegarderClientTXT(&client, fichierClient->txt, 0);
}
fflush(fichierClient->txt);
// fread()
}
void modificationClient(Client * client, FichierClient * fichierClient)
{
char choix = 0;
void * aModifier[] = {(Adresse *)&client->adresse, (char *)&client->contact.telephone, (char *)&client->contact.email};
char * aAfficher[] = {"Adresse", "Telephne", "E-mail"};
do
{
do
{
system("cls");
if(choix)
printf("Erreur choix errone !\n");
printf("MODIFICATION CLIENT %s %s \n", client->nom, client->prenom);
printf("1. Adresse\n2. Telephne\n3. E-mail\n");
printf("Votre choix :");clean_keyboard();scanf("%d", (int *)&choix);
}while(!(choix == 1 || choix == 2 || choix == 3));
printf("Modification %s :", aAfficher[choix-1]);
if(choix == 1)
{
if(!(printf("Entrez la rue :") && clean_keyboard() && fgets(client->adresse.rue,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le numero :" ) && clean_keyboard() && fgets(client->adresse.numero,__STRLEN__,stdin) != NULL && \
printf("\nEntrez la localité :") && clean_keyboard() && fgets(client->adresse.localite,__STRLEN__,stdin) != NULL && \
printf("\nEntrez le code postal :") && clean_keyboard() && scanf("%d", &(client->adresse.codePostal))))
{
printf("\nErreur lors de l'encodage de l'adresse");
exit(-1);
}
cleanFgets(client->adresse.rue);cleanFgets(client->adresse.numero);cleanFgets(client->adresse.localite);
}
else
{
clean_keyboard();
scanf("%s", (char *)aModifier[choix-1]);
}
printf("Y-a-til encore des Modification (y|n) ?");
clean_keyboard();scanf("%c", &choix);
}while((choix|0b00100000) == 'y');
sauvegarderClientFile(fichierClient, client);
clientBinToTXT(fichierClient);
}
long unsigned int nombreClients(FichierClient* fichierClient)
{
if(!fichierClient->bin)
return 0;
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; i<nbrClients && !feof(fichierClient->bin); 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);
}
}
void qSortClientBinByNP(Client ** clientTab)
{
long i;
Client *clientTmp;
//size_t sizeClient = sizeof(Client);
i=0;
while((*(clientTab+i+1)))
{
switch (compNP((*(clientTab+i))->nom,(*(clientTab+i))->prenom,(*(clientTab+i+1))->nom,(*(clientTab+i+1))->prenom))
{
case -1:
i++;
break;
case 1:
clientTmp = *(clientTab+i);
*(clientTab+i) = *(clientTab+i+1);
*(clientTab+i+1) = clientTmp;
if(i==0) //On est au début du fichier, inutile de comparer l'élem précédent
i++;
else
i--;
break;
case 0:
i++;
break;
}
}
}
void insertClientTabTrier(Client * client, Client *** clientTab)
{
long i = 0;
long nbrTab;
for(nbrTab=0;*((*clientTab)+nbrTab);nbrTab++);
Bool flagTrouver = FALSE;
Client *clientTmp;
Client **clientTabTmp;
*((*clientTab)+nbrTab) = (Client*)calloc(1,sizeof(Client));
clientTabTmp = (Client **)realloc(*clientTab, sizeof(Client)*(++nbrTab));
free(clientTab);
*clientTab = clientTabTmp;
*((*clientTab)+nbrTab) = NULL;
while(*((*clientTab)+i+1))
{
if(!flagTrouver)
{
switch (compNP((*((*clientTab)+i))->nom,(*((*clientTab)+i))->prenom,client->nom,client->prenom))
{
case -1:
i++;
break;
case 1: // trouver
flagTrouver = TRUE;
clientTmp = *((*clientTab)+i);
*((*clientTab)+i) = client;
client = clientTmp;
i++;
break;
case 0:
i++;
break;
}
}
else
{
clientTmp = *((*clientTab)+i);
*((*clientTab)+i) = client;
client = clientTmp;
i++;
}
}
clientTmp = *((*clientTab)+i);
*((*clientTab)+i) = client;
client = clientTmp;
}
void sauvegarderTabClientFile(FichierClient *fichierClient, Client ** client)
{
unsigned long int nbClients = 0;
Bool tri = 1;
fclose(fichierClient->bin);
fclose(fichierClient->txt);
fichierClient->bin = NULL;
fichierClient->txt = NULL;
unlink(fichierClient->emplacementBin);
unlink(fichierClient->emplacementTXT);
fichierClient->bin = fopen(fichierClient->emplacementBin, "w+b");
fichierClient->txt = fopen(fichierClient->emplacementTXT, "w+");
fwrite(&nbClients, sizeof(unsigned long int), 1, fichierClient->bin);
fwrite(&tri, sizeof(Bool), 1, fichierClient->bin);
while(*client)
{
(*client)->ofsetFichierDat = ftell(fichierClient->bin);
(*client)->ofsetFichierTXT = ftell(fichierClient->txt);
sauvegarderClientTXT((*client), fichierClient->txt, 0);
fwrite((*client++), sizeof(Client), 1, fichierClient->bin);
nbClients++;
}
fseek(fichierClient->bin, 0, SEEK_SET);
fwrite(&nbClients, sizeof(unsigned long int), 1, fichierClient->bin);
fflush(fichierClient->bin);
fflush(fichierClient->txt);
}
void setTriFlagFile(FichierClient* fichier)
{
Bool tri = TRUE;
Bool flag = FALSE;
if(fichier->bin == NULL)
{
fichier->bin = fopen(fichier->emplacementBin, "r+b");
flag = TRUE;
}
fseek(fichier->bin, sizeof(unsigned long int), SEEK_SET);
fwrite(&tri, sizeof(Bool), 1, fichier->bin);
if(flag)
{
fclose(fichier->bin);
fichier->bin = NULL;
}
}
void unsetTriFlagFile(FichierClient* fichier)
{
Bool tri = FALSE;
Bool flag = FALSE;
if(fichier->bin == NULL)
{
fichier->bin = fopen(fichier->emplacementBin, "r+b");
flag = TRUE;
}
fseek(fichier->bin, sizeof(unsigned long int), SEEK_SET);
fwrite(&tri, sizeof(Bool), 1, fichier->bin);
if(flag)
{
fclose(fichier->bin);
fichier->bin = NULL;
}
}
Bool getFlagTriFile(FichierClient * fichier)
{
Bool tri;
Bool flag = FALSE;
if(fichier->bin == NULL)
{
fichier->bin = fopen(fichier->emplacementBin, "r+b");
flag = TRUE;
}
fseek(fichier->bin, sizeof(unsigned long int), SEEK_SET);
fread(&tri, sizeof(Bool), 1, fichier->bin);
if(flag)
{
fclose(fichier->bin);
fichier->bin = NULL;
}
return tri;
}

1091
VANDAMME31.c Normal file

File diff suppressed because it is too large Load Diff

1209
VANDAMME32.c Normal file

File diff suppressed because it is too large Load Diff