1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
| /*On inclut les en-têtes de la bibliothèque standard du C*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*On inclut les en-têtes non-standard*/
/*#include <conio.h>*/ /*Je n'ai rien vu dans le code qui utilisait conio*/
/*-----------------*/
//On défini le nombre de caratéres que l'on peux saisir dans notre tableau
#define S_Produits (15)
#define S_Quantite (60)
//Structure pour le Nom du produit et sa quantité qu'il ya en stock .
typedef struct
{
char nomProduits[S_Produits+1];
char nombreProduits[S_Quantite+1];
} Fiche_Stock;
/*-----------------*/
/*Returns 0 if OK, a negative value if EOF.*/
int fpurge(FILE *f)
{
int c;
while((c=fgetc(f))!=EOF && c!='\n')
{ }
return (c==EOF ? -1 : 0);
}
/* Returns a nonzero value if found, zero if not. */
int truncate_newline(char *str)
{
int bRet=0;
if(str!=NULL)
{
char *pNewline = strchr(str, '\n');
if(pNewLine!=NULL)
{
bRet = 1;
*pNewLine = '\0';
}
}
return bRet;
}
/* Returns 0 if buffer is full, a positive value if line is complete,
a negative value if EOF (implies buffer full). */
int fclean(char *str, FILE *f)
{
int ret = 1;
if(!truncate_newline(str))
ret = fpurge(f);
return ret;
}
/*Fonction qui permetant de saisir une chaine enlevant le '\n'*/
void myGets(char const *prompt, char* chaine, size_t size )
{
fputs(prompt, stdout);
fgets(chaine, size, stdin);
fclean(chaine, stdin);
}
/*Fonction pour le menu*/
unsigned short menu()
{
char saisie[100];
unsigned short choix;
while(1)
{
printf("\t****************** Bienvenu Au Grand Bazar ******************\n\n\n");
printf("1 : Ouvrir un fichier de stockage\n");
printf("2 : Ajouter un produit\n");
printf("3 : Voir le stock \n");
printf("0 :Quitter\n");
printf("\nVotre choix : ");
fflush(stdout);
myGets(saisie,100,stdin);
if (sscanf(saisie, "%hu", &choix) == 1 && choix >= 0 && choix <= 3) break;
printf("Choix incorrect - Recommencez !!!\n");
}
return choix;
}
/*Fonction pour ouvrir un fichier */
FILE *ouvrir_fichier()
{
char nom[100+4]; /*Nom de fichier + extension .txt qu'on rajoute. */
char *pt;
printf("**Ouverture du fichier**\n\n");
myGets("Saisir un nom pour le fichier: ", nom, 100);
/* Ajouter extension ".txt" si elle n'est pas précisée */
if ((pt=strrchr(nom, '.')) == NULL || strcmp(pt, ".txt") != 0)
strcat(nom,".txt");/* on rajoute l'extension .txt au fichier*/
return fopen(nom, "a+");
}
/*Fonction pour ajouter un produit à la liste*/
void ajouterNom(FILE *fp)
{
Fiche_Stock prod; /*Laissons le nom 'p' aux pointeurs*/
printf("Ajouter nom\n");
myGets("Entrer un produit :", prod.nomProduits, S_Produits);
myGets("Entrer la quantite :", prod.nombreProduits, S_Quantite);
fprintf(fp, "%s:%s\n", prod.nomProduits, prod.nombreProduits); /*Attention il y avait un %s de trop*/
fflush(fp);
printf("enregistrement %s:%s ok\n", p.nomProduits, p.nombreProduits); /*Attention il y avait un %s de trop*/
}
/*Fonction pour affficher le stock*/
void listerNom(FILE *fp)
{
Fiche_Stock p;
long pos;
char ligne[100];
/* Récupération position courante */
pos=ftell(fp);
/* Positionnement au début du fichier */
fseek(fp, 0L, SEEK_SET);
/* Lecture fichier */
while (fgets(ligne, 100, fp) != NULL)
{
printf(ligne);
}
/* Repositionnement à la position initiale du fichier */
fseek(fp, pos, SEEK_SET);
}
/*Fonction pour afficher le menu*/
void afficher_menu()
{
FILE *fp=NULL;
unsigned short choix;
while((choix=menu()) != 0)
{
switch (choix)
{
case 1:
if(fp != NULL) fclose(fp); /*Il faut fermer le fichier s'il est déjà ouvert*/
fp=ouvrir_fichier();
if (fp == NULL)
fprintf(stderr, "Erreur ouverture fichier\n");
break;
case 2:
if (fp == NULL)
{
fprintf(stderr, "Il faut d'abord ouvrir le fichier\n");
break;
}
ajouterNom(fp);
break;
case 3:
if (fp == NULL)
{
fprintf(stderr, "Il faut d'abord ouvrir le fichier\n");
break;
}
listerNom(fp);
break;
}
}
/*À cause du while, le case 0 n'était jamais exécuté, je l'ai donc sorti du while*/
if (fp != NULL) fclose(fp);
fp = NULL; /*On remet à NULL après avoir fermé*/
}
/*Programme principal*/
int main()
{
/*Mise en place d'un systeme de mot de passe*/
int motpasse =77;
int code;
int nScan; /*Je rajoute cette variable pour tester le retour de scanf*/
do
{
printf("veuillez saisir le code : ");
nScan = scanf("%d",&code);
fpurge(stdin); /*On lit le \n et tout ce qui a été saisi derrière*/
if(nScan==1 && code==motpasse) /*Ainsi on ne fera pas la comparaison si code n'est pas initialisé*/
{
system("cls");
afficher_menu();
}
else
{
printf("Erreur de code !!!");
}
}
while(nScan != EOF && (nScan!=1 || code !=motpasse));
/*Le test de EOF permet de quitter complètement le programme si l'utilisateur ferme le flux d'entrée.*/
/*Le test de 1 permet de ne pas comparer le mot de passe tant que l'utilisateur n'en aura pas saisi un valide.*/
system("pause");
return 0;
} |
Partager