Vous êtes sur la page 1sur 11

15/03/2007

Algorithmique et programmation

Chapitre 6 Les fichiers squentiels 6:

Chap. 6 Les fichiers squentiels 6:


o Dfinition
o Fichier Un fichier (angl.: file) est un ensemble structur de donnes stock en gnral sur un support externe (disquette, disque dur, disque optique, ...). Un fichier structur contient une suite d'enregistrements homognes, qui regroupent le plus souvent plusieurs composantes (champs). Fichier squentiel Dans des fichiers squentiels, les enregistrements sont mmoriss conscutivement dans l'ordre de leur entre et peuvent seulement tre lus dans cet ordre. Si on a besoin d'un enregistrement prcis dans un fichier squentiel, il faut lire tous les enregistrements qui le prcdent, en commenant par le premier.

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o En simplifiant, nous pouvons nous imaginer qu'un fichier squentiel est enregistr sur un disque dur:

Chap. 6 Les fichiers squentiels 6:


o Proprits
Les fichiers squentiels que nous allons considrer dans ce cours auront les proprits suivantes:
n Les fichiers se trouvent ou bien en tat d'criture ou bien en tat de lecture; nous ne pouvons pas simultanment lire et crire dans le mme fichier. A un moment donn, on peut uniquement accder un seul enregistrement; celui qui se trouve en face de la tte de lecture/criture. Aprs chaque accs, la tte de lecture/criture est dplace derrire la donne lue en dernier lieu.

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o Fichiers standards Il existe deux fichiers spciaux qui sont dfinis par dfaut pour tous les programmes: - stdin le fichier d'entre standard - stdout le fichier de sortie standard En gnral, stdin est li au clavier et stdout est li l'cran En UNIX et en MS-DOS, il est possible de rediriger l'entre et la sortie standard vers d'autres fichiers ou priphriques l'aide des symboles < (pour stdin ) et > (pour stdout) Exemple L'appel suivant du programme PROG lit les donnes dans le fichier C:\TEST.TXT au lieu du clavier et crit les rsultats sur l'imprimante au lieu de l'cran. PROG <C:\TEST.TXT >PRN

Chap. 6 Les fichiers squentiels 6:


o La mmoire tampon Pour des raisons d'efficacit, les accs un fichier se font par l'intermdiaire d'une mmoire tampon (angl.: buffer). Cest ce que lon appelle la lecture/criture diffre. La mmoire tampon est une zone de la mmoire centrale de la machine rserve un ou plusieurs enregistrements du fichier. L'utilisation de la mmoire tampon a l'effet de rduire le nombre d'accs la priphrie d'une part et le nombre des mouvements de la tte de lecture/criture d'autre part.

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o o Accs aux fichiers squentiels Les problmes traitant des fichiers ont gnralement la forme suivante: un fichier donn par son nom (et en cas de besoin le chemin d'accs sur le mdium de stockage) doit tre cr, lu ou modifi. La question qui se pose est alors: Comment pouvons-nous relier le nom d'un fichier sur un support externe avec les instructions qui donnent accs au contenu du fichier ? Utilisation des deux fonctions fopen et fclose.

Chap. 6 Les fichiers squentiels 6:


o En rsum, la mthode employe sera la suivante: Avant de lire ou d'crire un fichier, l'accs est notifi par la commande fopen. fopen() accepte le nom du fichier (p.ex: C:\adresses.dat") en paramtre, ngocie avec le systme d'exploitation et fournit un pointeur spcial qui sera utilis ensuite lors de l'criture ou la lecture du fichier. Aprs les traitements, il faut annuler la liaison entre le nom du fichier et le pointeur l'aide de la commande fclose(). On peut dire aussi qu'entre les vnements fopen() et fclose() le fichier est ouvert.

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o o Le type FILE* Pour pouvoir travailler avec un fichier, un programme a besoin d'un certain nombre d'informations au sujet du fichier:
n n n n adresse de la mmoire tampon, position actuelle de la tte de lecture/criture, type d'accs au fichier: criture, lecture, ... tat d'erreur,

Ces informations (dont nous n'aurons pas nous occuper), sont rassembles dans une structure du type spcial FILE. Lorsque nous ouvrons un fichier avec la commande fopen, le systme gnre automatiquement un bloc du type FILE et nous fournit son adresse (notion de pointeur sur fichier).

Chap. 6 Les fichiers squentiels 6:


o Tout ce que nous avons faire dans notre programme est:
n n n n dclarer un pointeur du type FILE* pour chaque fichier dont nous avons besoin, affecter l'adresse retourne par fopen ce pointeur, employer le pointeur la place du nom du fichier dans toutes les instructions de lecture ou d'criture, librer le pointeur la fin du traitement l'aide de fclose.

;) reihcifnomp( esolf ;) w , tad. olop\\: c ( nepof=reihcifnomp

; reihcifnomp* EL IF

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o Ecriture dans un fichier : fprintf A linstar de linstruction printf qui permet dcrire une chane de caractre formatte sur la sortie standard, il existe une instruction, qui ralise la mme opration sur un fichier Exemple dutilisation:
;) eniahcenu ," n\s%" , reihcifnomp( ftnirpf

Lecture depuis un fichier : fscanf De mme que pour le couple printf/fprintf, il existe le couple scanf/fscanf. fscanf permet la lecture depuis un fichier plutt que depuis lentre standard.
fscanf(pmonfichier, "%s\n",unechaine);

Chap. 6 Les fichiers squentiels 6:


o o Exercice : Crer et afficher un fichier squentiel Avant de discuter les dtails du traitement des fichiers, nous vous prsentons un petit exemple qui runit les oprations les plus importantes sur les fichiers. Problme On se propose de crer un fichier qui est form d'enregistrements contenant comme information le nom d'une personne. Chaque enregistrement est donc constitu d'une seule rubrique, savoir, le nom de la personne. L'utilisateur doit entrer au clavier le nom du fichier, le nombre de personnes et les noms des personnes. Le programme se chargera de crer le fichier correspondant sur disque dur ou sur disquette. Aprs avoir crit et ferm le fichier, le programme va rouvrir le mme fichier en lecture et afficher son contenu, sans utiliser le nombre d'enregistrements introduit dans la premire partie.

o o

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o Ouvrir et fermer des fichiers squentiels
#include <stdio.h> main() { FILE *P_FICHIER; /* pointeur sur FILE */ char NOM_FICHIER[30]; /* nom du fichier */ ... do { printf("Entrez le nom du fichier : "); scanf("%s", NOM_FICHIER); P_FICHIER = fopen(NOM_FICHIER, "w"); if (!P_FICHIER) printf("\aERREUR: Impossible d'ouvrir " "le fichier: if (!P_FICHIER) %s.\n", NOM_FICHIER); { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", NOM_FICHIER); } while (!P_FICHIER); exit(-1); /* Abandonner le programme avec retour -1*/ } ... fclose(P_FICHIER); return 0; }

Chap. 6 Les fichiers squentiels 6:


o
o o o

Traitements par enregistrements


Les fichiers texte sont gnralement organiss en lignes, c.--d. la fin d'une information dans le fichier est marque par le symbole '\n': Attention ! Pour pouvoir lire correctement les enregistrements dans un fichier squentiel, le programmeur doit connatre l'ordre des diffrentes rubriques (champs) l'intrieur des enregistrements.

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o Ecrire dans un fichier squentiel en langage C - fprintf fprintf( <FP>, "<Form1>\n", <Expr1>); fprintf( <FP>, "<Form2>\n", <Expr2>); ... fprintf( <FP>, "<FormN>\n", <ExprN>); ou bien fprintf(<FP>,"<Form1>\n<Form2>\n...\n<FormN>\n", <Expr1>, <Expr2>, ... , <ExprN>);
n n * <FP> est un pointeur du type FILE* qui est reli au nom du fichier cible. * <Expr1>, <Expr2>, ... , <ExprN> reprsentent les rubriques qui forment un enregistrement et dont les valeurs respectives sont crites dans le fichier. * <Form1>, <Form2>, ... , <FormN> reprsentent les spcificateurs de format pour l'criture des diffrentes rubriques

Chap. 6 Les fichiers squentiels 6:


o Comparaisons
o L'instruction fprintf(stdout, "Bonjour\n"); est identique printf("\Bonjour\n"); Attention ! Notez que fprintf (et printf) crit toutes les chanes de caractres sans le symbole de fin de chane '\0'. Dans les fichiers texte, il faut ajouter le symbole de fin de ligne '\n' pour sparer les donnes.

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o o L'instruction fscanf(stdin, "%d\n", &N); est identique scanf("%d\n", &N); Attention ! Pour les fonctions scanf et fscanf tous les signes d'espacement sont quivalents comme sparateurs. En consquence, l'aide de fscanf, il nous sera impossible de lire toute une phrase dans laquelle les mots sont spars par des espaces.

Chap. 6 Les fichiers squentiels 6:


o Le traitement par caractre
La manipulation de fichiers avec les instructions fprintf et fscanf n'est pas assez flexible pour manipuler de faon confortable des textes crits. Il est alors avantageux de traiter le fichier squentiellement caractre par caractre. Ecrire un caractre dans un fichier squentiel - fputc fputc( <C> , <FP> ); fputc transfre le caractre indiqu par <C> dans le fichier rfrenc par <FP> et avance la position de la tte de lecture/criture au caractre suivant. Remarque L'instruction fputc('a', stdout); est identique putchar('a');

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o Le traitement par caractre Lire un caractre dans un fichier squentiel - fgetc <C> = fgetc( <FP> ); fgetc fournit comme rsultat le prochain caractre du fichier rfrenc par <FP> et avance la position de la tte de lecture/criture au caractre suivant. A la fin du fichier, fgets retourne EOF <C> reprsente une variable du type int qui peut accepter une valeur numrique de 0 255 ou le symbole de fin de fichier EOF. <FP> est un pointeur du type FILE* qui est reli au nom du fichier lire. Remarque L'instruction C = fgetc(stdin); est identique C = getchar();

Chap. 6 Les fichiers squentiels 6:


o Fin de fichier
o Dtection de la fin d'un fichier en langage C - feof feof( <FP> ); feof retourne une valeur diffrente de zro, si la tte de lecture du fichier rfrenc par <FP> est arrive la fin du fichier; sinon la valeur du rsultat est zro.<FP> est un pointeur du type FILE* qui est reli au nom du fichier lire. Pour que la fonction feof dtecte correctement la fin du fichier, il faut qu'aprs la lecture de la dernire donne du fichier, la tte de lecture arrive jusqu' la position de la marque EOF. Nous obtenons cet effet seulement si nous terminons aussi la chane de format de fscanf par un retour la ligne '\n' (ou par un autre signe d'espacement).

10

15/03/2007

Chap. 6 Les fichiers squentiels 6:


o Exemple
o Le programme suivant lit et affiche le fichier "C:\AUTOEXEC.BAT" en le parcourant caractre par caractre:
#include <stdio.h> #include <stdlib.h> main() { FILE *FP; FP = fopen("C:\\AUTOEXEC.BAT", "r"); if (!FP) { printf("Impossible d'ouvrir le fichier\n"); exit(-1); } while (!feof(FP)) putchar(fgetc(FP)); fclose(FP); return 0; }

Chap. 6 Les fichiers squentiels 6:


o Ajout/suppression dun enregistrement
n En fin de fichier n En dbut de fichier n En insrant dans le fichier.

11