Programmation Avancée en C


annuaire.c

00001 #include <stdint.h>
00002 #include <stdio.h>
00003 #include <stdlib.h>
00004 #include <string.h>
00005 
00006 #define STR_SIZE 50             // Taille maximale d'une chaine de caractères
00007 #define MAX_PERS 100            // Taille maximale de l'annuaire
00008 #define ANNUAIRE "annuaire.txt" // Le nom du fichier sauvegardant l'annuaire
00009 
00010 struct personne {
00011     char nom[STR_SIZE], prenom[STR_SIZE], tel[STR_SIZE];
00012     int age;
00013 };
00014 
00015 void error(char * msg) { // Affiche d'un message d'erreur et sortie.
00016     perror(msg);
00017     exit(EXIT_FAILURE);
00018 }
00019 
00020 int main()
00021 {
00022     struct personne tab[MAX_PERS] = {
00023         {"Varrette", "Sébastien", "+33 (0)0 11 22 33 44", 26},
00024         {"Bernard",  "Nicolas",   "+33 (0)0 55 66 77 88", 25},
00025         {"", "", "", -1} // Entrée spéciale qui indique la fin de l'annuaire.
00026     };
00027 
00028         /* Sauvegarde de l'annuaire. */
00029     FILE * fich = fopen(ANNUAIRE, "w");
00030     if ( fich == NULL ) error("[Erreur] fopen (write)");
00031     
00032     fseek(fich, 2, SEEK_SET);
00033     uint16_t i = 0;
00034     while (strlen(tab[i].nom) > 0) {
00035         fwrite(&tab[i], sizeof(struct personne), 1, fich);
00036         i++;
00037     }
00038     fseek(fich, 0, SEEK_SET);
00039     fwrite(&i, 2, 1, fich);
00040     fclose(fich);
00041     
00042         /* Récupération des données sauvegardées. */
00043     struct personne buffer;
00044     uint16_t nb_pers = 0; // Nombre de personnes dans l'annuaire.
00045     fich = fopen(ANNUAIRE, "r");
00046     if ( fich == NULL ) error("[Erreur] fopen (write)");
00047     
00048     fread(&nb_pers, 2, 1, fich);
00049     for (int i = 0; i < nb_pers; i++) {
00050         if (fread(&buffer, sizeof(struct personne), 1, fich) != 1) break;
00051         printf("Entrée %d\n", i + 1);
00052         printf("\t %s %s (age: %d) -->  %s\n",
00053                buffer.nom, buffer.prenom, buffer.age, buffer.tel);
00054     }
00055     fclose(fich);
00056     return 0;
00057 }