Vous êtes sur la page 1sur 20

Chapitre 8 Fichiers

I. Notion de fichier Un fichier est un paquet d'informations : ce peut tre aussi bien du texte, que de la musique ou une image. Chaque objet que vous manipulez en informatique (une page Web, la musique de, vos photos de vacances, un logiciel, etc.) correspond un fichier. Un fichier est un ensemble dinformations de mme type organise dune certaine faon et stockes sur un support externe de manire permanente (disque dur, flashe disqueetc.). Ces informations sont utilises dans une mme application ou pour un mme traitement.

I. Notion de fichier (suite) Le fichier squentiel est considr comme un prototype dentre/sortie qui aussi considr comme une base squentielle des informations (les informations sont lues ou crites lune aprs lautre en commenant par le premier enregistrement et sans pouvoir retourner en arrire). Un fichier est organis en gnrale sous forme de bloc ou denregistrement en squentielle. Dans un fichier squentiel pour accder un lment k on doit parcourir le fichier depuis le dbut.

II. dclaration de fichier


Un fichier est identifi par son nom physique qui est son chemin daccs sur un support de stockage. Dans un programme un fichier est manipul via son nom logique quon dclare comme une variable (pointeur). Dclaration Algorithmique Identificateur : Fichier de TypeDuBloc ; Exemple : F : Fichier Etudiant ; En langage C il suffit de dclarer un pointeur vers un fichier car il ny a pas la notion de type de fichier. File * F;

Les fichiers sur disque servent stocker des informations. On peut naviguer l'intrieur d'un tel fichier l'aide de fonctions de positionnement (que nous verrons un peu plus loin). A chaque instant, un pointeur indique la position courante dans le fichier. Ce pointeur se dplace, quelques exceptions prs, aprs chaque opration de lecture, d'criture ou appel d'une fonction de positionnement par exemple.

II.2 Ouverture et fermeture d'un fichier


Toute opration d'E/S dans un fichier commence par l'ouverture du fichier. Lorsqu'un fichier est ouvert, un flux lui est associ. Ce flux est reprsent par un pointeur vers un objet de type FILE. Pendant l'ouverture d'un fichier, on doit spcifier comment en dsire l'ouvrir : en lecture (c'est--dire qu'on va lire depuis le fichier), en criture (pour crire), ou en lecture et criture. La fonction fopen : FILE * fopen(const char * filename, const char * mode); Permet d'ouvrir un fichier dont le nom est spcifi par l'argument filename selon le mode, spcifi par l'argument mode, dans lequel on souhaite ouvrir le fichier.

II.2 Ouverture et fermeture d'un fichier (suite)


Elle retourne l'adresse d'un objet de type FILE qui reprsente le fichier l'intrieur du programme. En cas d'erreur, NULL est retourn et une valeur indiquant la cause de l'erreur est place dans errno. En pratique, dans le cas d'un fichier sur disque, l'argument nom peut tre aussi bien un chemin complet qu'un chemin relatif. Notez bien que les notions de chemin, rpertoire (qui inclut galement les notions de rpertoire courant, parent, etc.), ... sont dpendantes du systme, elles ne font pas partie du langage C.

II.2 Ouverture et fermeture d'un fichier (suite) Fondamentalement, les valeurs suivantes peuvent tre utilises dans l'argument mode : "r" : ouvrir le fichier en lecture. Le fichier spcifi doit dj exister. "w" : ouvrir le fichier en criture. S'il n'existe pas, il sera cr. S'il existe dj, son ancien contenu sera effac. "a" : ouvrir le fichier en mode ajout, qui est un mode dans lequel toutes les oprations d'criture dans le fichier se feront la fin du fichier. S'il n'existe pas, il sera cr.

II.2 Ouverture et fermeture d'un fichier (suite)


Quel que soit le cas, le fichier sera associ un flux de texte. Pour spcifier qu'on veut ouvrir le fichier en tant que fichier binaire, il suffit d'ajouter le suffixe 'b' (c'est-dire "rb", "wb" ou "ab"). Sauf dans le cas du mode "ab" et drivs, dans lequel le pointeur pourrait, selon l'implmentation, tre positionn la fin du fichier, il sera positionn au dbut du fichier. On peut galement ajouter un '+' dans l'argument mode. Par exemple : "r+", "r+b" ou encore "rb+" mais "r+b" et "rb + . La prsence du '+' aura pour effet de permettre d'effectuer aussi bien des oprations de lecture que d'criture sur le fichier. On dit alors que le fichier est ouvert en mode mise jour.

II.2 Ouverture et fermeture d'un fichier (suite) Avant d'effectuer une opration de lecture juste aprs une opration d'criture, il faut tout d'abord appeler fflush ou une fonction de positionnement Avant d'effectuer une opration d'criture juste aprs une opration de lecture, il faut d'abord appeler une fonction de positionnement, moins d'avoir atteint la fin du fichier. Lorsqu'on n'en a plus besoin, il faut ensuite fermer le fichier :
int fclose(FILE * f);

Exemple
Le programme suivant cre un fichier, hello.txt, pour y crire ensuite une et une seule ligne : Hello, world.
#include <stdio.h> int main() { FILE * f; f = fopen("hello.txt", "w"); if (f != NULL) { fprintf(f, "Hello, world\n"); fclose(f); } return 0;

II.2 Lecture et criture dans un fichier


Il existe plusieurs mthodes de lectures et dcriture dans un fichier en Langage C. Dans ce cours, on ne va aborder que les deux fonctions qui travaille sur des blocs de donnes. Ces deux fonctions sont utiles pour manipuler des fichiers typs i.e le fichier est subdivis en plusieurs bloc et chaque bloc reprsente un enregistrement Exp : un fichier qui contient les informations des tudiants c.a.d fichier Etudiant.

II.2.1 Lecture / criture par bloc


La bibliothque standard offre des fonctions permettant de raliser des oprations d'entres/sorties par blocs d'octets. Il s'agit des fonctions fread et fwrite. size_t fread(void *pointeur, size_t taille, size_t nombre, FILE *f);

size_t fwrite(void *pointeur, size_t taille, size_t nombre, FILE *f);


O pointeur est l'adresse du dbut des donnes transfrer, taille la taille des objets transfrer, nombre leur nombre. La fonction fread lit les donnes sur le flot f et la fonction fwrite les crit. Elles retournent toutes les deux le nombre de donnes transfres.

II.3 Positionnement dans un fichier II.3.1. Position courante


Lors de louverture dun fichier le pointeur (flux associ) est toujours positionn en dbut de fichier. Ce pointeur se dplace dans le fichier (en avant ou en arrire) selon les oprations effectues. Les oprations de lecture (respectivement d'criture) commencent la lecture (respectivement l'criture) partir de la position courante puis ensuite dplacent le pointeur en avant selon le nombre de caractres lus (respectivement crits).

II.3.1. Position courante Il existe toutefois des exceptions comme dans le cas ou le fichier est ouvert en mode ajout par exemple, auquel cas toutes les oprations d'criture se feront la fin du fichier, indpendamment de la position courante.
Ce mode daccs est appel le mode squentiel : les donnes du fichier sont lues ou crites les unes la suite des autres. Il est galement possible d'accder un fichier en mode direct, c'est--dire que l'on peut se positionner n'importe quel endroit du fichier.

II.3.2 manipulation de la position du pointeur dun fichier


La fonction fseek permet de se positionner un endroit prcis ; elle a pour prototype :
int fseek(FILE *f, long deplacement, int origine);

La variable deplacement dtermine la nouvelle position dans le fichier. Il s'agit d'un dplacement relatif par rapport l'origine ; il est compt en nombre d'octets. La variable origine peut prendre trois valeurs :
SEEK_SET (gale 0) : dbut du fichier ; SEEK_CUR (gale 1) : position courante ; SEEK_END (gale 2) : fin du fichier.

La fonction rewind dfinie par le prototype :

int rewind(FILE *f);


permet de se positionner au dbut du fichier. Elle est quivalente fseek(f, 0, 0);
La fonction ftell dfinie par le prototype :

long ftell(FILE *f);


Retourne la position courante dans le fichier (en nombre d'octets depuis l'origine).

III. Oprations sur les fichiers


N.B. Les fonctions douverture et de fermeture des fichiers reprsentent des oprations sur les fichiers. III.1. Renommer ou dplacer un fichier La fonction rename :
int rename(const char * oldname, const char * newname);

Permet de renommer un fichier lorsque cela est possible. Si la fonction russit, 0 est retourn. III.2. Supprimer un fichier La fonction remove :
int remove(const char * filename);

Permet de supprimer un fichier. Si la fonction russit, 0 est retourn.

III.3. Les fichiers temporaires Un fichier temporaire est un fichier utilis par un programme puis supprim lorsque celui-ci se termine. La fonction tmpfile FILE * tmpfile(void); Permet de crer un fichier en mode "wb+" qui sera automatiquement supprim la fin du programme. On peut toujours bien sr crer un fichier temporaire manuellement . III.4 Rediriger un flux d'E/S La fonction freopen : FILE * freopen(const char * filename, const char * mode, FILE * f); ferme le fichier associ au flux f, ouvre le fichier dont le nom est spcifi par filename selon le mode spcifi par mode en lui associant le flux reprsent par f puis retourne f ou NULL si une erreur s'est produite.

Dans le programme suivant, la sortie standard est redirige vers le fichier out.txt.
#include <stdio.h> int main()

{
if (freopen("out.txt", "w", stdout) != NULL) { printf("Hello, world\n"); fclose(stdout); } else perror("out.txt"); return 0; }