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
|
#include <stdio.h>
#include <string.h>
typedef struct {
int note;
char nom[100 + 1];
} t_eleve;
int chargeEleve(char *fic, t_eleve *tab) {
FILE *fp;
char zone[100 + 1];
char *c;
if ((fp = fopen(fic, "r")) == NULL) return -1; //ouvre le fichier "fic", affecte un "oeil de lecture" qu'on stock dans "fp". Si l'oeil est "NULL" retourne -1 (valeur sentinelle)
while (fgets(zone, 100 + 1, fp) != NULL) { //boucle "while", tournant tant que la liste "zone" remplit à partir de "fp", est non-"NULL".
if ((c = strchr(zone, '\n')) != NULL) *c = '\0'; //condition "if", remplaçant "\n" par "\0", si le pointeur "c" est non-"NULL"
if ((c = strchr(zone, ';')) == NULL) continue; //condition "if", continuant si le pointeur "c" est "NULL"
*c = '\0'; //si pointeur "c" est non-"NULL", remplace ";" par "\0"
tab->note = atoi(zone); //transfprme la chaine de caractère représentant un nombre dans le tableau "zone" en son équivalent numérique et le place dans le membre note du tableau tab
strcpy(tab->nom, c + 1); //copie les caractère du tableau pointé par "c+1" dans le membre du tableau pointé par "tab"
tab++; //passe à la case suivante de la structure, qui est 1*sizeof(*tab) plus loin. (tab + n == tab + n * sizeof(*tab))
}
fclose(fp); // fermeture du flux "fp"
tab->note = -1; // tab ayant été incrémenté encore une fois à la fin de la boucle, une valeur sentinelle est placé afin d'éviter tout débordement de mémoire
tab->nom[0] = '\0'; // de même.
return 0; // retour d'une valeur sentinelle
}
void Incrementeur(t_eleve *pt){ // prend la cellule active du tableau et ajoute 2 points au membre note, si ça ne dépasse pas 20
if (pt->note <= 18) // ajoute 2 points si le membre note du tableau pt est plus petit ou égal à 18
pt->note += 2;
else
pt->note = 20; // sinon le membre note du tableau pt est égal à 20
}
int EcritEleve(char *destf, t_eleve *pt) { // écrit le contenu du tableau "pt" dans un fichier "destf"
FILE *fd;
char zone[100 + 1];
if ((fd = fopen(destf, "w")) == NULL) return -1; // crée un fichier "destf" en écriture, affecte un "oeil d'écriture" qu'on stock dans "fd". Si l'oeil est NULL, retourne -1
while (pt->note != -1) { // boucle while tournant tant quelle ne reconntre pas de valeur sentinelle
sprintf(zone, "%d; %s", pt->note, pt->nom); // recompose la phrase sur base des deux membres "note" et "nom" du tableau pt et les stock dans le tableau zone
fputs(zone, fd); // prend le contenu du tableau "zone" et l'écrit dans l'"oeil d'écriture" stocké dans "fd".
pt++; // passe à la case suivante du tableau "pt" de structure "t_eleve"
}
fclose(fd); // fermeture du flux "fd"
return 0;
}
int main() {
t_eleve tab[100]; // tableau "tab" de 100 structure t-eleve
t_eleve *pt; // pointeur pt de structure t_eleve
chargeEleve("note.txt", tab); //remplit le tableau "tab" avec le contenu du fichier "fic"
for (pt = tab; pt->note != -1; pt++) // boucle for imprimant à l'écran les données du tableau pointé par "tab", condition d'interruption: les valeurs sentinelles
{
Incrementeur(pt); //Ajout de deux points à la note.
printf("elève=%s, note=%d\n", pt->nom, pt->note); //impression écran des résultats des élèves
}
/* OU
for (pt = tab; strcmp(pt->nom, "") == 0 ; pt++) // boucle "for" imprimant à l'écran les données du tableau pointé par "tab", condition d'interruption: les valeurs sentinelles
printf("elève=%s, note=%d\n", pt->nom, pt->note);
*/
EcritEleve("anniversaire.txt", pt); //
return 0;
} |
Partager