3. Plan:
Motivation
Qu'est-ce qu'un fichier ?
Déclaration
Les types de fichiers
Ouverture/Fermeture
Lecture/écriture dans un fichier texte
Lecture /écriture dans un fichier binaire
Renommer un fichier
Supprimer un fichier
La manipulation des fichiers en c
3
4. Motivation
Un programme a en général besoin :
De sauvegarder des variables alors qu’elles sont créées dans la
mémoire vive et une fois le programme est arrêté, ces variables
sont supprimées de la mémoire et il devient impossible d’accéder
à leurs valeurs.
De lire des données (texte, nombres, images, sons, mesures, …)
De sauvegarder des résultats (texte, nombres, images, sons,
signaux générés, …)
Cela se fait en lisant et en écrivant dans des fichiers 4
5. Qu'est-ce qu'un fichier ?
Données organisées, support de sauvegarde (disquette,
disque dur, CD/DVD)
peut contenir du texte, de la vidéo, des données pour des
applications.
Mémoire de masse persistante (pas effacée quand hors-
tension)
5
6. Manipulation de fichiers
Opérations standard à mener pour travailler avec un fichier :
Ouvrir un fichier : lui associer une variable que l'on appelle
descripteur de fichier : permettra l'accès au fichier.
Lire ou écrire des informations à partir de ce descripteur avec
des fonctions spécialement prévues pour les fichiers.
Fermer le fichier : indiquer qu'on a terminé de travailler avec ce
fichier
Supprimer un fichier
Renommer un fichier 6
7. Déclaration:
Pour manipuler un fichier on a besoin d’un certain nombre
d’informations comme:
Le mode d’accès à ce fichier
L’adresse de la mémoire tampon où se trouve le fichier
La position de la tête de lecture/écriture
État d’erreur…
Toutes ces informations sont rassemblées dans le type FILE
Ce type est défini dans la bibliothéque <stdio.h>
Un objet de type FILE* est nommé un flot de données
Déclaration
7
8. Les fichiers textes
Un fichier texte est un fichier dont le contenu représente
une suite de caractères lisibles.
Les types de fichiers
8
9. Les fichiers binaires:
Tout fichier qui n’est pas de type texte est un fichier binaire
Dans un fichier texte, on enregistre un texte lisible.
Dans un fichier binaire, on peut enregistrer n'importe quelle
donnée(texte, image, son) mais qui n'est pas interprétable.
Les types de fichiers
9
10. Pour pouvoir lire et écrire dans un fichier il faut commencer par ouvrir ce fichier.
Syntaxe: f=fopen("chemin", "mode");
La fonction fopen ouvre un fichier et lui associe un flot de donnée (elle renvoie un
pointeur sur le fichier).
Si l'exécution de cette fonction ne se déroule pas normalement, elle retourne une valeur
NULL Il est donc recommandé de faire un test
- f est une variable de type FILE*
- Le premier paramètre est le chemin d’accès au fichier :
Exemple :
"monFich.txt" s’il est situé dans le même dossier que votre exécutable
" C:mondossiermonFich.txt " s’il est situé n’importe où ailleurs sur le disque dur.
- Le deuxième paramètre est une chaine de caractère spécifiant le mode d’accès .
Ouverture d’un fichier
10
11. Ouverture d’un fichier
Les modes d’accès à un fichier texte:
"r" ouverture d'un fichier texte en lecture
"w" ouverture d'un fichier texte en écriture
"a" ouverture d'un fichier texte en écriture à la fin
"r+" ouverture d'un fichier texte en lecture/écriture
"w+" ouverture d'un fichier texte en lecture/écriture
"a+" ouverture d'un fichier texte en lecture/écriture à la fin
11
12. Si le mode contient la lettre r, le fichier doit exister.
Si le mode contient la lettre w, le fichier peut ne pas exister.
Dans ce cas, il sera créé.
Si le fichier existe déjà, son ancien contenu sera perdu.
Si le mode contient la lettre a, le fichier peut ne pas exister.
Dans ce cas, il sera créé.
Si le fichier existe déjà, les nouvelles données seront ajoutées à
la fin du fichier précédent.
Ouverture d’un fichier
12
13. Ouverture d’un fichier
Les modes d’accès à un fichier binaire:
"rb" ouverture d'un fichier binaire en lecture
"wb" ouverture d'un fichier binaire en écriture
"ab" ouverture d'un fichier binaire en écriture à la fin
"r+b" ouverture d'un fichier binaire en lecture/écriture
"w+b" ouverture d'un fichier binaire en lecture/écriture
"a+b" ouverture d'un fichier binaire en lecture/écriture à la fin
13
14. Ouverture d’un fichier
Juste après l'ouverture du fichier, il faut impérativement vérifier si
l'ouverture est réussi ou non. Pour faire ça, c'est très simple : si le
pointeur vaut NULL, l'ouverture a échoué. S'il vaut autre chose que
NULL, l'ouverture a réussi.
On va donc suivre systématiquement le schéma suivant :
14
Mode
d’ouverture
15. Après les manipulations, on doit annuler la liaison entre le fichier et
le flot de donnée via la fonction fclose :
fclose(f);
Cette fonction a pour rôle de libérer la mémoire, c'est-à-dire
supprimer votre fichier chargé dans la mémoire vive.
Si on oublie de libérer la mémoire, votre programme risque à la fin
de prendre énormément de mémoire qu'il n'utilise plus
La fonction fclose retourne un entier qui vaut zéro si l'opération s'est
déroulée normalement (et une valeur non nulle en cas d'erreur).
Fermeture d’un fichier
15
17. Ecriture dans un fichier texte
17
Ecriture d’un caractère :
La fonction fputc, analogue à putchar, permet d’écrire un caractère
dans un fichier texte. Syntaxe:
fputc(c,f);
Où c est une variable de type char .
18. Ecriture dans un fichier texte
18
Ecriture d’une ligne dans un fichier texte : fputs
La fonction fputs, analogue à puts, permet d’écrire toute une ligne
dans un fichier texte. Syntaxe:
fputs(chaine,f);
Où:
-chaîne est de type pointeur vers char et pointe vers un tableau de
caractères.
La fonction fputs rend une valeur non négative si l'écriture se passe
sans erreur, et EOF en cas d'erreur.
19. Ecriture dans un fichier texte
19
Ecriture formatée dans un fichier texte:
La fonction fprintf, analogue à printf, permet d'écrire des données dans un
fichier texte à part le fait que vous devez indiquer le fichier en premier
paramètre. Syntaxe:
int fprintf(f,"chaîne de contrôle",expression-1, ..., expression-n);
la valeur de retour indique le nombre de caractères écrits
Exemple:
fprintf(f, " %s %s %dn",nom, prenom, age);
Remarques:
Un 'n' écrit dans un fichier provoquera un passage à la ligne
le caractère de fin de fichier est ajouté automatiquement, pas besoin de le mettre.
21. Lecture depuis un fichier texte
21
Lecture d’un caractère:
La fonction fgetc, analogue à getchar, permet de lire un caractère dans un
fichier texte. Syntaxe:
c = fgetc(f);
Cette fonction dont le type de retour est int, retourne le caractère lu dans
le fichier. Elle retourne la constante EOF (End-Of-File) lorsqu'elle
détecte la fin du fichier.
Au fur et à mesure que vous lisez un caractère du fichier avec fgetc, vous
avez un « curseur » qui avance. C'est un curseur virtuel bien entendu.
Vous pouvez donc créer une boucle pour lire les caractères un par un dans
le fichier.
23. Lecture depuis un fichier texte
23
Lecture par ligne dans un fichier texte: fgets
La fonction fgets, analogue à gets, permet de lire toute une ligne dans un
fichier texte (elle s’arrête au premier n qu’elle rencontre). Syntaxe:
fgets(chaine,taille,f);
La fonction fgets() :
lit une ligne et la stocke dans le tableau chaîne.
lit au plus un nombre de caractères égal à taille diminué de un afin de laisser
la place pour le caractère nul, qui est automatiquement ajouté.
La fonction fgets rend un pointeur sur chaîne en cas de lecture sans erreur, ou
un pointeur NULL dans le cas de fin de fichier ou d'erreur.
En cas de fin de fichier ou erreur, fgets rend NULL et non pas EOF!
24. Lecture depuis un fichier texte
24
Vous n’avez qu’à faire un While pour boucler tant que fgets ne
renvoie pas NULL.
25. Lecture depuis un fichier texte
25
Lecture formatée dans un fichier texte:
La fonction fscanf, analogue à scanf, permet de lire des données dans un fichier
texte.
Syntaxe:
int fscanf(f,"chaîne de contrôle",argument-1, ..., argument-n);
fscanf fournit le nombre de valeurs lues convenablement ou la valeur EOF si une
erreur s’est produite ou si une fin de fichier a été rencontrée avant qu’une seule
valeur ait pu être lue.
Exemple:
fscanf(f, " %s %s %dn",nom, prenom, &age);
26. Lecture/écriture dans un fichier binaire
26
Les entrées/sorties binaires:
Ces entrées/sorties sont plus efficaces que les entrées
sortie standard car les données sont transférées sans
transcodage.
Inconvénient: Ces fichiers ne sont pas portables car le
codage dépend de la machine.
27. Ecriture dans un fichier binaire
27
La fonction qui permet de sauvegarder des données dans un fichier binaire:
size_t fwrite(void *pointeur, size_t taille, size_t nombre, FILE *flot);
• pointeur : zone de mémoire où se trouvent les éléments à écrire dans le fichier
• taille : taille en octets d'un élément
• nombre : nombre d'éléments à écrire
• flot : fichier où aura lieu l’écriture.
• La valeur de retour indique le nombre d'éléments effectivement écrits.
Exemple: pour écrire une donnée de type Etudiant e et la sauvegarder dans le
fichier f
fwrite( &e, sizeof(Etudiant), 1, f);
28. Lecture depuis un fichier binaire
28
La fonction qui permet de lire des données à partir d’un fichier binaire:
size_t fread (void *pointeur, size_t taille, size_t nombre, FILE *flot);
• pointeur : zone de mémoire où sera stockée les données lus à partir du fichier
• taille : taille en octets d'un élément
• nombre : nombre d'éléments à lire
• flot : fichier où aura lieu la lecture.
• La valeur de retour indique le nombre d'éléments effectivement lus.
Exemple: pour lire une donnée de type Etudiant et la sauvegarder dans la
variable e:
fread( &e, sizeof(Etudiant), 1, f);
29. Exemple de programmes utilisant des fichiers binaires : utiliser la similitude entre
tableaux et fichiers binaires .
Premier programme : tableau contenant des struct, à écrire dans un fichier binaire.
La structure est définie ainsi :
Fichiers binaires et tableaux
29
30. Que va faire le programme ?
Déclarer un tableau contenant des valeurs de type t_complex;
Initialiser le tableau;
ouvrir un fichier binaire en écriture
si l'ouverture s'est bien déroulée
écrire les éléments du tableau dans le fichier
fermer le fichier
Fichiers binaires et tableaux
30
31. où remplacer les 3 fwrite par un seul :
Fichiers binaires et tableaux
31
32. Lecture d'un fichier binaire pour placer les valeurs lues dans un
tableau : il faut par contre connaître par avance le nombre
d'éléments stockés dans le fichier ou utiliser une boucle pour lire le
fichier.
Dans l'exemple qui suit, on va reprendre le fichier créé par
l'écriture précédente et le relire.
On garde le type créé t_complex, défini de la même manière.
Programme très ressemblant, on utilisera fread à la place de fwrite!
Fichiers binaires et tableaux
32
34. Renommer un Fichier
34
La fonction rename() permet de renommer un fichier
prototype :
int rename(const char* ancienNom, const char* nouveauNom);
La fonction renvoie 0 si elle a réussi à renommer, sinon
elle renvoie une valeur différente de 0.
35. Supprimer un fichier
35
La fonction Remove supprime un fichier sans demander de
confirmation
prototype :
int remove(const char* fichier);