Вы находитесь на странице: 1из 11

15/03/2007

Algorithmique et programmation

Algorithmique et programmation ChapitreChapitre 66 : Les fichiers séquentiels
Algorithmique et programmation ChapitreChapitre 66 : Les fichiers séquentiels
Algorithmique et programmation ChapitreChapitre 66 : Les fichiers séquentiels
Algorithmique et programmation ChapitreChapitre 66 : Les fichiers séquentiels

ChapitreChapitre 66: Les fichiers séquentiels

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Définition o Fichier Un fichier (angl.: file ) est
Chap.Chap. 66 : Les fichiers séquentiels o Définition o Fichier Un fichier (angl.: file ) est
Chap.Chap. 66 : Les fichiers séquentiels o Définition o Fichier Un fichier (angl.: file ) est
Chap.Chap. 66 : Les fichiers séquentiels o Définition o Fichier Un fichier (angl.: file ) est

o

Définition

o

Fichier

Un fichier (angl.: file) est un ensemble structuré de données stocké en général sur un support externe (disquette, disque

dur, disque optique,

).

Un fichier structuré contient une

suite d'enregistrements homogènes, qui regroupent le plus souvent plusieurs composantes (champs).

o

Fichier séquentiel Dans des fichiers séquentiels, les enregistrements sont mémorisés consécutivement dans l'ordre de leur entrée et peuvent seulement être lus dans cet ordre. Si on a besoin d'un enregistrement précis dans un fichier séquentiel, il faut lire tous les enregistrements qui le précèdent, en commençant par le premier.

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o En simplifiant, nous pouvons nous imaginer qu'un fichier séquentiel
Chap.Chap. 66 : Les fichiers séquentiels o En simplifiant, nous pouvons nous imaginer qu'un fichier séquentiel
Chap.Chap. 66 : Les fichiers séquentiels o En simplifiant, nous pouvons nous imaginer qu'un fichier séquentiel
Chap.Chap. 66 : Les fichiers séquentiels o En simplifiant, nous pouvons nous imaginer qu'un fichier séquentiel

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

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

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Propriétés Les fichiers séquentiels que nous allons considérer dans
Chap.Chap. 66 : Les fichiers séquentiels o Propriétés Les fichiers séquentiels que nous allons considérer dans
Chap.Chap. 66 : Les fichiers séquentiels o Propriétés Les fichiers séquentiels que nous allons considérer dans
Chap.Chap. 66 : Les fichiers séquentiels o Propriétés Les fichiers séquentiels que nous allons considérer dans

o

Propriétés

Les fichiers séquentiels que nous allons considérer dans ce cours auront les propriétés suivantes:

n

Les fichiers se trouvent ou bien en état d'écriture ou bien en état de lecture; nous ne pouvons pas simultanément lire et écrire dans le même fichier.

n

A un moment donné, on peut uniquement accéder à un seul enregistrement; celui qui se trouve en face de la tête de lecture/écriture.

n

Après chaque accès, la tête de lecture/écriture est déplacée derrière la donnée lue en dernier lieu.

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Fichiers standards Il existe deux fichiers spéciaux qui sont
Chap.Chap. 66 : Les fichiers séquentiels o Fichiers standards Il existe deux fichiers spéciaux qui sont
Chap.Chap. 66 : Les fichiers séquentiels o Fichiers standards Il existe deux fichiers spéciaux qui sont
Chap.Chap. 66 : Les fichiers séquentiels o Fichiers standards Il existe deux fichiers spéciaux qui sont

o

Fichiers standards Il existe deux fichiers spéciaux qui sont définis par défaut pour tous les programmes:

- stdin le fichier d'entrée standard - stdout le fichier de sortie standard En général, stdin est lié au clavier et stdout est lié à l'écran

o

En UNIX et en MS-DOS, il est possible de rediriger l'entrée et la sortie standard vers d'autres fichiers ou périphériques à l'aide des symboles < (pour stdin ) et > (pour stdout)

o

Exemple L'appel suivant du programme PROG lit les données dans le fichier C:\TEST.TXT au lieu du clavier et écrit les résultats sur l'imprimante au lieu de l'écran. PROG <C:\TEST.TXT >PRN

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o La mémoire tampon Pour des raisons d'efficacité, les accès
Chap.Chap. 66 : Les fichiers séquentiels o La mémoire tampon Pour des raisons d'efficacité, les accès
Chap.Chap. 66 : Les fichiers séquentiels o La mémoire tampon Pour des raisons d'efficacité, les accès
Chap.Chap. 66 : Les fichiers séquentiels o La mémoire tampon Pour des raisons d'efficacité, les accès

o La mémoire tampon Pour des raisons d'efficacité, les accès à un fichier se font par l'intermédiaire d'une mémoire tampon (angl.:

buffer). C’est ce que l’on appelle la lecture/écriture différée. La mémoire tampon est une zone de la mémoire centrale de la machine réservée à un ou plusieurs enregistrements du fichier. L'utilisation de la mémoire tampon a l'effet de réduire le nombre d'accès à la périphérie d'une part et le nombre des mouvements de la tête de lecture/écriture d'autre part.

à la périphérie d'une part et le nombre des mouvements de la tête de lecture/écriture d'autre

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Accès aux fichiers séquentiels o Les problèmes traitant des
Chap.Chap. 66 : Les fichiers séquentiels o Accès aux fichiers séquentiels o Les problèmes traitant des
Chap.Chap. 66 : Les fichiers séquentiels o Accès aux fichiers séquentiels o Les problèmes traitant des
Chap.Chap. 66 : Les fichiers séquentiels o Accès aux fichiers séquentiels o Les problèmes traitant des

o

Accès aux fichiers séquentiels

o

Les problèmes traitant des fichiers ont généralement la forme suivante: un fichier donné par son nom (et en cas de besoin le chemin d'accès sur le médium 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 accès au contenu du fichier ?

o

Utilisation des deux fonctions fopen et fclose.

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o En résumé, la méthode employée sera la suivante: Avant
Chap.Chap. 66 : Les fichiers séquentiels o En résumé, la méthode employée sera la suivante: Avant
Chap.Chap. 66 : Les fichiers séquentiels o En résumé, la méthode employée sera la suivante: Avant
Chap.Chap. 66 : Les fichiers séquentiels o En résumé, la méthode employée sera la suivante: Avant

o

En résumé, la méthode employée sera la suivante:

Avant de lire ou d'écrire un fichier, l'accès est notifié par la commande fopen.

o

fopen() accepte le nom du fichier (p.ex: « C:\adresses.dat") en paramètre, négocie avec le système d'exploitation et fournit un pointeur spécial qui sera utilisé ensuite lors de l'écriture ou la lecture du fichier. Après les traitements, il faut annuler la liaison entre le nom du fichier et le pointeur à l'aide de la commande fclose().

o

On peut dire aussi qu'entre les événements fopen() et fclose() le fichier est ouvert.

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Le type FILE* o Pour pouvoir travailler avec un
Chap.Chap. 66 : Les fichiers séquentiels o Le type FILE* o Pour pouvoir travailler avec un
Chap.Chap. 66 : Les fichiers séquentiels o Le type FILE* o Pour pouvoir travailler avec un
Chap.Chap. 66 : Les fichiers séquentiels o Le type FILE* o Pour pouvoir travailler avec un

o

Le type FILE*

o

Pour pouvoir travailler avec un fichier, un programme a besoin d'un certain nombre d'informations au sujet du fichier:

n

adresse de la mémoire tampon,

n

position actuelle de la tête de lecture/écriture,

n

type d'accès au fichier: écriture, lecture,

n

état d'erreur,…

o

Ces informations (dont nous n'aurons pas à nous occuper), sont rassemblées dans une structure du type spécial FILE. Lorsque nous ouvrons un fichier avec la commande fopen, le système génère automatiquement un bloc du type FILE et nous fournit son adresse (notion de pointeur sur fichier).

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Tout ce que nous avons à faire dans notre
Chap.Chap. 66 : Les fichiers séquentiels o Tout ce que nous avons à faire dans notre
Chap.Chap. 66 : Les fichiers séquentiels o Tout ce que nous avons à faire dans notre
Chap.Chap. 66 : Les fichiers séquentiels o Tout ce que nous avons à faire dans notre

o Tout ce que nous avons à faire dans notre programme est:

n

déclarer un pointeur du type FILE* pour chaque fichier dont nous avons besoin,

n

affecter l'adresse retournée par fopen à ce pointeur,

n

employer le pointeur à la place du nom du fichier dans toutes les instructions de lecture ou d'écriture,

n

libérer le pointeur à la fin du traitement à l'aide de fclose.

F I LE *pmonfichie r;

pmonfichie r = fopen ( « c: \\ polo . da t», «w ») ;

flose (pmonfichie r ) ;

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Ecriture dans un fichier : fprintf A l’instar de
Chap.Chap. 66 : Les fichiers séquentiels o Ecriture dans un fichier : fprintf A l’instar de
Chap.Chap. 66 : Les fichiers séquentiels o Ecriture dans un fichier : fprintf A l’instar de
Chap.Chap. 66 : Les fichiers séquentiels o Ecriture dans un fichier : fprintf A l’instar de

o

Ecriture dans un fichier : fprintf A l’instar de l’instruction printf qui permet d’écrire une chaîne de caractère formattée sur la sortie standard, il existe une instruction, qui réalise la même opération sur un fichier

o

Exemple d’utilisation:

fp r intf (pmonfichie r ," % s \ n ", unech a ine ) ;

o

Lecture depuis un fichier : fscanf De même que pour le couple printf/fprintf, il existe le couple scanf/fscanf. fscanf permet la lecture depuis un fichier plutôt que depuis l’entrée standard.

fscanf(pmonfichier, "%s\n",unechaine);

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Exercice : Créer et afficher un fichier séquentiel o
Chap.Chap. 66 : Les fichiers séquentiels o Exercice : Créer et afficher un fichier séquentiel o
Chap.Chap. 66 : Les fichiers séquentiels o Exercice : Créer et afficher un fichier séquentiel o
Chap.Chap. 66 : Les fichiers séquentiels o Exercice : Créer et afficher un fichier séquentiel o

o

Exercice : Créer et afficher un fichier séquentiel

o

Avant de discuter les détails du traitement des fichiers, nous vous présentons un petit exemple qui réunit les opérations les plus importantes sur les fichiers.

o

Problème

o

On se propose de créer 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.

o

L'utilisateur doit entrer au clavier le nom du fichier, le nombre de personnes et les noms des personnes. Le programme se chargera de créer le fichier correspondant sur disque dur ou sur disquette.

o

Après avoir écrit et fermé le fichier, le programme va rouvrir le même fichier en lecture et afficher son contenu, sans utiliser le nombre d'enregistrements introduit dans la première partie.

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

     

main()

Ouvrir et fermer des fichiers séquentiels

printf("Entrez le nom du fichier : "); scanf("%s", NOM_FICHIER); P_FICHIER = fopen(NOM_FICHIER, "w");

#include <stdio.h>

FILE *P_FICHIER; /* pointeur sur FILE */ char NOM_FICHIER[30]; /* nom du fichier */ . do {

.

.

*/ char NOM_FICHIER[30]; /* nom du fichier */ . do { . . if if (!P_FICHIER)

if if (!P_FICHIER) (!P_FICHIER) printf("\aERREUR: Impossible d'ouvrir " "le fichier:

%s.\n", { NOM_FICHIER);

} while (!P_FICHIER); printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", NOM_FICHIER);

exit(-1); /* Abandonner le programme avec retour -1*/

}

%s.\n", NOM_FICHIER); exit(-1); /* Abandonner le programme avec retour -1*/ } . fclose(P_FICHIER); return 0; }

. fclose(P_FICHIER); return 0; }

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Traitements par enregistrements o Les fichiers texte sont
Chap.Chap. 66 : Les fichiers séquentiels o Traitements par enregistrements o Les fichiers texte sont
Chap.Chap. 66 : Les fichiers séquentiels o Traitements par enregistrements o Les fichiers texte sont
Chap.Chap. 66 : Les fichiers séquentiels o Traitements par enregistrements o Les fichiers texte sont

o

Traitements par enregistrements

o

Les fichiers texte sont généralement organisés en lignes, c.-à-d. la fin d'une information dans le fichier est marquée par le symbole '\n':

o

Attention !

o

Pour pouvoir lire correctement les enregistrements dans un fichier séquentiel, le programmeur doit connaître l'ordre des différentes rubriques (champs) à l'intérieur des enregistrements.

le programmeur doit connaître l'ordre des différentes rubriques (champs) à l'intérieur des enregistrements.

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Ecrire dans un fichier séquentiel en langage C -
Chap.Chap. 66 : Les fichiers séquentiels o Ecrire dans un fichier séquentiel en langage C -
Chap.Chap. 66 : Les fichiers séquentiels o Ecrire dans un fichier séquentiel en langage C -
Chap.Chap. 66 : Les fichiers séquentiels o Ecrire dans un fichier séquentiel en langage C -

o Ecrire dans un fichier séquentiel 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

* <FP> est un pointeur du type FILE* qui est relié au nom du fichier cible.

n

* <Expr1>, <Expr2>,

, <ExprN> représentent les rubriques qui

forment un enregistrement et dont les valeurs respectives sont écrites dans le fichier.

n

* <Form1>, <Form2>,

, <FormN> représentent les spécificateurs de

format pour l'écriture des différentes rubriques

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Comparaisons o L'instruction fprintf(stdout,
Chap.Chap. 66 : Les fichiers séquentiels o Comparaisons o L'instruction fprintf(stdout,
Chap.Chap. 66 : Les fichiers séquentiels o Comparaisons o L'instruction fprintf(stdout,
Chap.Chap. 66 : Les fichiers séquentiels o Comparaisons o L'instruction fprintf(stdout,

o

Comparaisons

o

L'instruction fprintf(stdout, "Bonjour\n"); est identique à printf("\Bonjour\n"); Attention ! Notez que fprintf (et printf) écrit toutes les chaînes de caractères sans le symbole de fin de chaîne '\0'. Dans les fichiers texte, il faut ajouter le symbole de fin de ligne '\n' pour séparer les données.

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o L'instruction o fscanf(stdin, "%d\n", &N); est
Chap.Chap. 66 : Les fichiers séquentiels o L'instruction o fscanf(stdin, "%d\n", &N); est
Chap.Chap. 66 : Les fichiers séquentiels o L'instruction o fscanf(stdin, "%d\n", &N); est
Chap.Chap. 66 : Les fichiers séquentiels o L'instruction o fscanf(stdin, "%d\n", &N); est

o

L'instruction

o

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 séparateurs. En conséquence, à l'aide de fscanf, il nous sera impossible de lire toute une phrase dans laquelle les mots sont séparés par des espaces.

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels oo LeLe traitementtraitement parpar caractèrecaractère La manipulation de
Chap.Chap. 66 : Les fichiers séquentiels oo LeLe traitementtraitement parpar caractèrecaractère La manipulation de
Chap.Chap. 66 : Les fichiers séquentiels oo LeLe traitementtraitement parpar caractèrecaractère La manipulation de
Chap.Chap. 66 : Les fichiers séquentiels oo LeLe traitementtraitement parpar caractèrecaractère La manipulation de

oo LeLe traitementtraitement parpar caractèrecaractère

La manipulation de fichiers avec les instructions fprintf et fscanf n'est pas assez flexible pour manipuler de façon confortable des textes écrits. Il est alors avantageux de traiter le fichier séquentiellement caractère par caractère.

Ecrire un caractère dans un fichier séquentiel - fputc fputc( <C> , <FP> ); fputc transfère le caractère indiqué par <C> dans le fichier référencé par <FP> et avance la position de la tête de lecture/écriture au caractère suivant. Remarque L'instruction fputc('a', stdout); est identique à putchar('a');

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels oo LeLe traitementtraitement parpar caractèrecaractère Lire un caractère dans
Chap.Chap. 66 : Les fichiers séquentiels oo LeLe traitementtraitement parpar caractèrecaractère Lire un caractère dans
Chap.Chap. 66 : Les fichiers séquentiels oo LeLe traitementtraitement parpar caractèrecaractère Lire un caractère dans
Chap.Chap. 66 : Les fichiers séquentiels oo LeLe traitementtraitement parpar caractèrecaractère Lire un caractère dans

oo

LeLe traitementtraitement parpar caractèrecaractère

Lire un caractère dans un fichier séquentiel - fgetc <C> = fgetc( <FP> ); fgetc fournit comme résultat le prochain caractère du fichier référencé par <FP> et avance la position de la tête de lecture/écriture au caractère suivant. A la fin du fichier, fgets retourne EOF <C> représente une variable du type int qui peut accepter une valeur numérique 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.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Fin de fichier Détection de la fin d'un fichier
Chap.Chap. 66 : Les fichiers séquentiels o Fin de fichier Détection de la fin d'un fichier
Chap.Chap. 66 : Les fichiers séquentiels o Fin de fichier Détection de la fin d'un fichier
Chap.Chap. 66 : Les fichiers séquentiels o Fin de fichier Détection de la fin d'un fichier

o Fin de fichier

Détection de la fin d'un fichier en langage C - feof

o feof( <FP> ); feof retourne une valeur différente de zéro, si la tête de lecture du fichier référencé par <FP> est arrivée à la fin du fichier; sinon la valeur du résultat est zéro.<FP> est un pointeur du type FILE* qui est relié au nom du fichier à lire.

Pour que la fonction feof détecte correctement la fin du fichier, il faut qu'après la lecture de la dernière donnée du fichier, la tête de lecture arrive jusqu'à la position de la marque EOF. Nous obtenons cet effet seulement si nous terminons aussi la chaîne de format de fscanf par un retour à la ligne '\n' (ou par un autre signe d'espacement).

15/03/2007

Chap.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Exemple o Le programme suivant lit et affiche le
Chap.Chap. 66 : Les fichiers séquentiels o Exemple o Le programme suivant lit et affiche le
Chap.Chap. 66 : Les fichiers séquentiels o Exemple o Le programme suivant lit et affiche le
Chap.Chap. 66 : Les fichiers séquentiels o Exemple o Le programme suivant lit et affiche le

o Exemple

o Le programme suivant lit et affiche le fichier "C:\AUTOEXEC.BAT" en le parcourant caractère par caractère:

#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.Chap. 66: Les fichiers séquentiels

Chap.Chap. 66 : Les fichiers séquentiels o Ajout/suppression d’un enregistrement n En fin de fichier n
Chap.Chap. 66 : Les fichiers séquentiels o Ajout/suppression d’un enregistrement n En fin de fichier n
Chap.Chap. 66 : Les fichiers séquentiels o Ajout/suppression d’un enregistrement n En fin de fichier n
Chap.Chap. 66 : Les fichiers séquentiels o Ajout/suppression d’un enregistrement n En fin de fichier n

o Ajout/suppression d’un enregistrement

n

En fin de fichier

n

En début de fichier

n

En insérant dans le fichier.

d’un enregistrement n En fin de fichier n En début de fichier n En insérant dans