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
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 20
#define nomFichier "toto.dat"
struct s_personne {
char nom[NMAX];
char prenom[NMAX];
int age;
};
typedef struct s_personne personne;
void saisiePersonnes(personne ** tbPersonnes, int * nbPersonnes) {
char continuer;
int i;
personne tbPerso[30];
*nbPersonnes = 0;
printf("Saisie des infos de personnes (30 max)\n");
do {
printf("Personne %d\n", *nbPersonnes);
printf("nom = "); scanf("%s", &(tbPerso[ *nbPersonnes ].nom));
printf("prenom = "); scanf("%s", &(tbPerso[ *nbPersonnes ].prenom));
printf("age = "); scanf("%d", &(tbPerso[ *nbPersonnes ].age));
*nbPersonnes = *nbPersonnes + 1;
printf("Autre personne (o/n) ? ");
do {
scanf("%c", &continuer);
} while (continuer != 'o' && continuer != 'n');
} while (continuer == 'o');
if (*tbPersonnes = (personne *)malloc(*nbPersonnes * sizeof(personne))) {
for (i=0; i < *nbPersonnes; i++) {
(*tbPersonnes)[i] = tbPerso[i];
}
} else
printf("Problème d'allocation mémoire.\n");
printf("\n");
}
void creerFichierPersonnes (personne * tbPersonnes, int nbPersonnes) {
FILE * fBin;
if (fBin = fopen(nomFichier, "wb")) {
fwrite(tbPersonnes, sizeof(personne), nbPersonnes, fBin);
fclose(fBin);
} else {
printf("Impossible d'ouvrir le fichier %s en écriture.", nomFichier);
}
}
void editerFichierPersonnes () {
char nomPerso[NMAX+1];
int tailleChaine, i;
FILE * fBin;
personne p;
// Initialisation du tableau
for (i=0; i <= NMAX; i++)
nomPerso[i] = '\0';
fflush(stdin);
printf("Entrez le nom de la personne pour laquelle vous voulez modifier les infos = \n");
fgets(nomPerso, NMAX+1, stdin);
// Si la chaine entrée est inférieure à NMAX caractères, on supprime le dernier \n
i = 0;
while (nomPerso[i]) {
if (nomPerso[i] == '\n')
nomPerso[i] = '\0';
i++;
}
if (fBin = fopen(nomFichier, "r+b")) {
while (fread(&p, sizeof(personne), 1, fBin) > 0) {
printf("pos = %d\n", ftell(fBin));
if (!strcmp(p.nom, nomPerso)) {
printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
printf("Entrez un nouvel âge = ");
scanf("%d", &(p.age));
// Déplacement du pointeur du fichier à la fin de l'enregistrement précédent
fseek(fBin, -sizeof(personne), SEEK_CUR);
// Enregistre la structure modifiée dans le fichier
fwrite(&p, sizeof(personne), 1, fBin);
}
}
fclose(fBin);
} else
printf("Impossible d'ouvrir le fichier %s en lecture / écriture.", nomFichier);
}
void afficherPersonnes() {
FILE * fBin;
personne p;
if (fBin = fopen(nomFichier, "rb")) {
printf("Listing des personnes\n");
while (fread(&p, sizeof(personne), 1, fBin) > 0)
printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
fclose(fBin);
printf("\n");
} else {
printf("Impossible d'ouvrir le fichier %s en lecture.", nomFichier);
}
}
int main() {
personne * tbPersonnes;
int nbPersonnes;
saisiePersonnes(&tbPersonnes, &nbPersonnes);
creerFichierPersonnes(tbPersonnes, nbPersonnes);
free(tbPersonnes);
afficherPersonnes();
editerFichierPersonnes();
afficherPersonnes();
return 0;
} |
Partager