fread et fgets : Lecture dans un fichier

Si vous avez compris comment écrire dans un fichier, vous allez voir que la lecture est assez similaire. Je profiterai d'ailleurs de ce cours pour me servir de l'écriture dans les fichiers pour vous faire un peu revoir.

Pour lire dans un fichier, il existe deux fonctions dont l'une d'entre elles a déjà été un peu expliquée au long de mes cours. freadva vous permettre de lire des fichiers binaires et fgets va vous permettre de lire des fichiers textes.

Lecture d'un fichier binaire



Comme je vous l'ai donc dit, il va vous falloir utiliser la fonction fread pour lire dans les fichiers binaires. Sa signature est la suivante :

  1. size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);  


Comme vous le voyez, cette fonction va renvoyer une variable de type size_t qui est en fait une valeur entière contenant le nombre d'éléments que la fonction aura lu. En ce qui concerne les arguments, vous voyez que cette fonction en prend 4 et ceux-ci sont les même que pour la fonction fwrite. Le premier déterminera dans quelle variable les données lues seront stockées, le deuxième désigne la taille des données qui seront lues, le troisième définit le nombre de fois que nous lirons cette taille et le dernier paramètre est le pointeur de fichier dans lequel la lecture s'effectuera.

Nous allons donc faire un petit programme, permettant d'enregistrer 2 étudiants et de les lire par après, tapez donc :

  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. typedef struct {  
  5.     char nom[64];  
  6.     char prenom[64];  
  7. } etudiant;  
  8.   
  9. int main() {  
  10.   
  11.     etudiant e[2];  
  12.     etudiant bis[2];  
  13.   
  14.     FILE *f = fopen("a.bin""wb");  
  15.   
  16.     strcpy(e[0].nom, "Zick");  
  17.     strcpy(e[0].prenom, "Zack");  
  18.   
  19.     strcpy(e[1].nom, "Zock");  
  20.     strcpy(e[1].prenom, "Zuck");  
  21.   
  22.     fwrite(e, 2 * sizeof(etudiant), 1, f);  
  23.   
  24.     fclose(f);  
  25.   
  26.     f = fopen("a.bin""rb");  
  27.   
  28.     fread(bis, 2 * sizeof(etudiant), 1, f);  
  29.   
  30.     printf ("Etudiant 1 : %s %s\n", bis[0].nom, bis[0].prenom);  
  31.     printf ("Etudiant 2 : %s %s\n", bis[1].nom, bis[1].prenom);  
  32.   
  33.     fclose(f);  
  34.   
  35.     return 0;  
  36.   
  37. }  


ImageImageImage


Comme vous le voyez, nous déclarons une structure nommée etudiant qui contiendra le nom et le prénom d'un étudiant. Nous déclarons également deux tableaux, le premier verra ses valeurs initialisées par le programme mais le second (bis) verra ses valeurs initialisées par la fonction de lecture fread. Nous déclarons enfin une variable f qui contiendra l'adresse de fichier renvoyée par fopen qui, ici, va ouvrir un fichier appelé a.bin en écriture binaire.

Les 4 lignes suivantes permettent d'initialiser les valeurs du tableau. Nous sauvons ensuite le tableau grace à la fonction fwritevue dans le cours prédécent et nous fermons le fichier.

Nous réouvrons ensuite le fichier, mais en mode lecture (je sais qu'il y avait une manière plus simple de faire ce programme, mais pas avec les connaissances que nous avons pour l'instant). Nous lisons ensuite des données avec la fonction fread. Nous passons en premier argument l'adresse du tableau bis vu que c'est lui qui va récupérer les données lues. Le deuxième argument sera la taille en octet que l'on va lire. Nous nous préparons à lire 2 structures de type etudiant vu que la taille du tableau est de 2, nous multiplions donc par 2 la taille d'une structure etudiant renvoyée par sizeof. Le troisième argument signifie que nous ne lirons qu'une seule fois la taille demandée et le quatrième argument est l'adresse du fichier dans lequel la lecture s'effectuera.

Les deux lignes suivantes permettent d'afficher les données lues et comme vous le voyez, les noms et prénoms des deux étudiants sont correctement récupérées et affichées. La ligne suivante permet de fermer le fichier.

Lecture d'un fichier texte



Maintenant que vous avez vu comment lire un fichier binaire, nous allons voir comment lire un fichier texte et ce avec la fonctionfgets. La déclaration de cette fonction est la suivante :

  1. char * fgets (char * s, int size, FILE * stream);  


Comme vous le voyez, cette fonction va vous renvoyer un pointeur vers la chaine de caractères passée en premier argument si la fonction réussit et NULL si elle échoue. Le premier argument de cette fonction est la chaine de caractères qui contiendra la portion de texte lue dans le fichier. Le deuxième argument est le nombre maximal d'octet à lire. La fonction s'arrête de lire si la portion lue dépasse cette taille ou si elle rencontre un \0 ou \n. Enfin, le dernier argument est le flux vers le fichier dans lequel on effectue la lecture.

Pour illustrer l'exemple que je vais donner, commencez par enregistrer le texte suivant dans un fichier nommé einstein.txt que vous placerez dans votre répertoire de travail :

  1. Albert Einstein (14 mars 1879 à Ulm, Württemberg, Allemagne - 18 avril 1955 à Princeton, New Jersey, États-Unis) physicien allemand, puis apatride (1896), suisse (1899), et enfin suisse-américain (1940).  
  2.   
  3. Il a publié la théorie de la relativité restreinte en 1905 et une théorie de la gravité dite relativité générale en 1915. Il a largement contribué au développement de la mécanique quantique et de la cosmologie. Il a reçu le prix Nobel de physique en 1921 pour son explication de l'effet photoélectrique. Son travail est notamment connu pour l'équation E=mc² qui quantifie l'énergie disponible dans la matière.  


(Cet texte est tiré de cette page : http://fr.wikipedia.org/wiki/Einstein).

Nous allons maintenant faire un programme qui se chargera de lire ce fichier :

  1. #include <stdio.h>  
  2.   
  3. int main() {  
  4.   
  5.     char phrase[256];  
  6.   
  7.     FILE *f = fopen("einstein.txt""r");  
  8.   
  9.     while (fgets(phrase, 256, f) != NULL)  
  10.         printf (phrase);  
  11.   
  12.     return 0;  
  13.   
  14. }  


ImageImageImage


Comme vous le voyez, ce n'est pas très long. Nous commençons par déclarer une chaine de caractères phrase qui servira à contenir les portions de phrases lues. Ensuite, nous ouvrons le fichier einstein.txt en lecture et nous plaçons l'adresse vers ce fichier dans le pointeur f. Ensuite, nous allons exécuter une instruction tant que la fonction fgets ne renverra pas NULL (elle renvoie NULL quand elle n'a plus rien à lire). Comme vous le voyez, nous faisons passer phrase en premier argument de fgetspour que les données lues soient placées dedans. Nous définissons la taille maximale des données lues sur 256 grace au deuxième argument et nous signalons au programme que la lecture doit se faire dans le fichier pointé par f. L'instruction a exécuter tant que des données ont été lues est justement l'affichage de ces données.

Comme je vous l'ai dit, la fonction fgets ne s'arrête que lorsque qu'elle rencontre un \0 ou \n. Une fois une lecture effectuée, le curseur de position reste au même endroit et donc quand nous faisons une deuxième lecture ce ne sera plus depuis le début du fichier mais depuis la position du curseur, la fonction lira donc la suite du texte.

Et voilà, vous savez maintenant utiliser les fonctions de bases des fichiers, nous allons maintenant voir des fonctions permettant de vous simplifier la vie :-p

0 comments:

Post a Comment