Vous êtes sur la page 1sur 8

ESI Cours : Algorithmique / Pascal

INTRODUCTION AUX FICHIERS


Par CHERGOU B.

Nous avons vu dans les chapitres prcdents comment construire des programmes et des modules qui utilisent
des objets de divers types. Nous avons aussi vu l'norme intrt de leur sauvegarde sur un support magntique
(disquettes, disques durs) mme s'ils sont inachevs ce qui nous vite de les rcrire chaque fois que nous les
utilisons et nous avons vu aussi comment crer notre propre bibliothque de modules et programmes mis au
point.
Eh bien ! le fait de les stocker sur un support magntique en donnant chacun d'eux un nom distinct,
nous avons cr des petits fichiers contenant les programmes et modules que nous avons labors.

Cependant cela n'a pas t le cas pour les donnes manipules par nos programmes et modules. Ds que
l'on "sort" de notre programme ou module ou que l'on teint notre ordinateur ces donnes sont perdues car elles
sont stockes dans la mmoire vive de l'ordinateur, alors que pour les garder il aurait fallu les mettre sur un
support magntique de stockage, autrement dit dans un fichier.

Les informations que l'on veut stocker peuvent prendre deux formes :
- des donnes sous forme de composants (ou articles)
- du texte.

1.1 FICHIER DE DONNEES

C'est un ensemble de composants ou d'articles traitant du mme sujet et regroups sous un mme nom.

* La dclaration d'un fichier de donnes se fait en prcisant le mot FICHIER suivi du type des
composants. Ce dernier pouvant avoir n'importe quel type (lmentaire ou structur).

Exemple :
Type
T = TABLEAU [1..20] d'entiers
F = FICHIER de T (* fichier dont chaque composant contient un tableau de type T *)
correspondant = ENREGISTREMENT
Nom : chane [ 25 ]
Notel : entier
FIN
r = FICHIER de correspondant (* fichier dont chaque composant contient un correspondant *)

Variables
F1 : FICHIER d'entiers (* chaque composant contient un entier *)
Enr : F (* chaque composant contient un tableau *)
Repertoire : r (* chaque composant contient un correspondant *)

* Dclaration en PASCAL

Exemple
Variable Repertoire FILE OF article ;

1.2 FICHIER TEXTE

C'est une suite de caractres du jeu ASCII dcoupe sous forme de lignes, pouvant tre de longueurs diffrentes.
(Chaque ligne de terminant par un "retour chariot" ventuellement suivi d'un changement de ligne).
CHERGOU B. 1 page :
ESI Cours : Algorithmique / Pascal

* la dclaration d'un fichier texte se fait simplement en prcisant le type TEXTE.

Exemple :
Variable Livre : TEXTE

* Dclaration en PASCAL

Exemple:

Variable Livre : TEXT;

1.3 OPERATIONS FONDAMENTALES SUR LES FICHIERS

1. Liaison entre nom de fichier interne et nom de fichier externe:

Une variable fichier interne doit tre relie un fichier externe. Cette liaison se fera grce une
procdure d'assignation.

ASSIGN ( Variable_fichier_interne , Nom_ de_fichier_externe ) ;

Variable_fichier_interne : Fichier
Nom_de_fichier_externe : chane de caractres

Exemple
ASSIGN (repertoire , ' A : FIC1.DAT' )

qui est identique :

FIC_EXT := 'a:FIC1.DAT' ;
ASSIGN ( repertoire , FIC_EXT) ;

2. Ouverture des fichiers :

Aprs l'tape d'assignation, un fichier doit tre ouvert. Deux cas sont possibles :

a) Le fichier n'existe pas, nous allons le crer. Il s'agit donc d'un nouveau fichier. Dans ce cas
l'ouverture se fait l'aide de la procdure :

REWRITE ( f )
ou f est le nom du fichier logique, par exemple : REWRITE (rpertoire)

b) Le fichier existe dj et nous voulons le consulter ou le mettre jour (cration de nouveaux


composants, suppression de composants, modification de composants) alors l'ouverture se fera par la procdure:

CHERGOU B. 2 page :
ESI Cours : Algorithmique / Pascal
RESET ( f)

3. Fermeture des fichiers :

Lorsque le traitement d'un fichier est termin il ne faut pas oublier de le fermer grce la procdure :

CLOSE ( f )

4. Lecture / Ecriture dans les fichiers :

Nous pouvons lire ou crire un composant d'un fichier l'aide les procdures que nous connaissons dj
et qui sont WRITE et WRITELN, et READ et READLN la seule diffrence que nous avons utilis jusqu'
prsent les noms de fichiers par dfaut ( cran pour l'criture et le clavier pour la lecture ). Donc pour lire ou
crire dans un fichier il suffit de prciser son nom.

WRITE ( f , paramtre1 , paramtre2 ,......., paramtren )


WRITELN ( f , paramtre1 , paramtre2 ,......., paramtren )

READ ( f , paramtre1 , paramtre2 ,......., paramtren )


READLN ( f , paramtre1 , paramtre2 ,......., paramtren )

ou f : fichier

exemple:
READ ( repertoire, article);
WRITELN (repertoire, article );

5. Variable fentre ou variable tampon :

Il faut toujours dclarer une variable appele variable tampon ou variable


fentre qui est du mme type que le composant du fichier. Et , lors d'une lecture, en crivant LIRE (F , fentre ) le
contenu du composant se trouvant la position fixe par le pointeur est mis dans la variable fentre. De la mme
manire, en crivant ECRIRE ( F, fentre) le contenu de la variable fentre est crit dans le composant se trouvant
la position fixe par le pointeur ( Voir exemple).

1.4 FICHIERS A ACCES SEQUENTIEL ET FICHIERS A ACCES DIRECT

Dans les fichiers accs squentiel, les composants ou articles sont rangs les uns la suite des autres de telle
manire ce que si l'on veut accder un composant nous sommes obligs de lire tous ceux qui se trouvent avant.
Lors de la lecture dans un fichier accs squentiel aprs les tapes d'assignation et d'ouverture, le
pointeur se place automatiquement sur le premier composant (position 0) , et aussitt que vous faites une lecture
le pointeur se place automatiquement sur le composant suivant Mais, faites attention ! vrifiez si ce n'est pas la
fin du fichier, car tenter de lire au del de la fin du fichier provoque une erreur qu'il faudra viter.

Cependant, dans les fichiers accs direct, il est possible d'accder


directement un composant. Dans ce cas la rpartition des composants, lors de le cration du fichier ou de leur
recherche dans des oprations de consultation ou de mise jour, se fait grce l'utilisation de formule de
transformation de la forme F(indicatif) = Adresse physique ou adresse relative ou grce des tables d'index dans
lesquelles on aura des couples ( indicatif , position ).
Dans les fichiers accs direct, une fois que vous avez la position du composant (qui est fournie par
votre formule ou votre table index ) vous pouvez y accder directement en utilisant la procdure SEEK ( f ,
POS).

NOTA : Le passage d'un objet de type fichier se fait TOUJOURS par variable ( VAR).

1.5 FONCTIONS ET PROCEDURES STANDARDS DES FICHIERS TYPES

(consulter la brochure Fonctions et procdures standards de turbo Pascal )

CHERGOU B. 3 page :
ESI Cours : Algorithmique / Pascal

1.6 EXEMPLES
Dans les exemples dtaills suivants, nous avons privilgi la partie programmation (les algorithmes
pouvant tre dduits aisment de cette dernire, car il ne contiennent aucune difficult particulire

Dans les exemples qui suivent, il est question de construire un rpertoire tlphonique, puis de le lister et enfin de
le consulter en squentiel puis en direct. Nous avons construit 4 modules :
1 ) cration du rpertoire
2 ) listage de son contenu
3 ) recherche d'un numro de tlphone partir du nom selon l'accs squentiel
4 ) recherche dun nom et du numro de tlphone dun correspondant partir de sa position du dans le
fichier selon l'accs direct.

CREATION DU REPERTOIRE

TYPE comp = ENREGISTREMENT


nom :chane [25]
notel : entier
FIN
R = FICHIER de comp
Chem = chane [50]

ANALYSE : On va crer pour la premire fois le fichier Rep et on enregistrera un un les composants.

PROCEDURE creafile (var rep:r;chemin:string);


(* ----PROCEDURE DE CREATION DU FICHIER REPERTOIRE --------- *)
var article:correspondant; (* declaration de la variable tampon
(ou variable fenetre) article *)
encore:char;
BEGIN
clrscr;
writeln('Nous allons creer le fichier repertoire - tapez sur ENTREE ');
readln;
assign(rep,chemin); (* assignation entre REP et votre fichier *)
rewrite(rep); (* ouverture du fichier que l'on va creer *)
repeat
clrscr;
Gotoxy(20,5);
write('NOM : ');
readln(article.nom);
Gotoxy(20,8);
write('NUMERO DE TELEPHONE : ');
readln(article.notel);
write (rep,article);
write('Y at-il encore des elements a rajouter ? (tapez O/N)');
readln(encore);
until (encore = 'n') OR (encore = 'N');
close (rep);
write ('Votre fichier a ete cree');
CHERGOU B. 4 page :
ESI Cours : Algorithmique / Pascal
readln;
END;

PROGRAM PRINCIPAL;
uses crt;
(* -----PROGRAMME PRINCIPAL UTILISANT LA PROCEDURE CREAFILE -------- *)
type correspondant = RECORD
nom:string[25];
notel:longint;
END;
r =FILE OF correspondant;
var repertoire:r; (* Declaration du fichier repertoire *)
Chem :string[50]; (* chem va contenir le chemin d'acces du fichier *)
{$i E:\algo\modules\creafile.pro}
BEGIN
write('SVP ! donner le chemin d''acces de votre fichier: ');
readln(chem);
creafile(repertoire,chem);
END.

LISTAGE DU CONTENU DU REPERTOIRE

ANALYSE : Tous les composants du fichier sont crits un un sur l'imprimante.

PROCEDURE listfile (var rep:r;chemin :chem);


(* ------- PROCEDURE D'IMPRESSION DU FICHIER REPERTOIRE ---------- *)
var article:composant;
i:integer;
BEGIN
assign(rep,chemin); (* assignation entre rep et votre fichier *)
reset(rep); (* ouverture du fichier repertoire *)
:=0;
writeln(lst,' NOM NUMERO DE TELEPHONE ');
repeat
read(rep,article);
(* -------En precisant LST comme nom du fichier dans le write,
l'impression se fera sur votre imprimante, mais n'oubliez pas
de noter PRINTER au niveau de USES ----------------------------- *)
writeln(lst,article.nom:20,article.notel:10);
i:=i + 1;

CHERGOU B. 5 page :
ESI Cours : Algorithmique / Pascal
until eof(rep); (* detection de la fin du fichier *)
close (rep); (* fermeture du fichier rep *)
END;

PROGRAM FICHIER2;
uses crt,printer;
(* ------------- PROGRAMME PRINCIPAL UTILISANT LA PROCEDURE LISTFILE ---------------------- *)
type composant = RECORD
nom:string[25];
notel:longint;
END;
r =FILE OF composant;
ch=string[25];
var repertoire:r; (* Declaration du fichier repertoire *)
{$i E:\algo\modules\listfile.pro}
BEGIN
writeln('ATTENTION : connectez votre imprimante puis appuyez sur ENTREE**');
readln;
write('SVP ! donner le chemin d''acces de votre fichier: ');
readln(chem);
listfile(repertoire,chem);
readln;
END.

RECHERCHE EN SEQUENTIEL DUN CORRESPONDANT A PARTIR DE SON N OM

ANALYSE : On lit un un les composants du fichier et on teste si le nom figurant dans le


composant lu est gal au nom recherch. Si c'est le cas on met le numro de tlphone dans
Tele. Si on dtecte la fin de fichier et le nom n'est toujours pas trouv on met 0 dans Tele.

PROCEDURE consreps(var rep:r;chemin :string; ncor:ch;var tele:longint);


(* -----PROCEDURE DE CONSULTATION SEQUENTIELLE DU FICHIER REPERT
on donne un nom et elle retourne un numero de telephone ou zero dans le cas ou le nom n'existe pas ---- *)
var trouve:char;
i:integer;
article:composant;
BEGIN
assign(rep,chemin); (* assignation entre rep et f1.dat *)
reset(rep); (* ouverture de rep *)
i:=0;
trouve:='N';
repeat
read(rep,article);
if article.nom = ncor then
BEGIN
tele := article.notel;
trouve :='O';
END;
until eof(rep) OR (trouve ='O');
CHERGOU B. 6 page :
ESI Cours : Algorithmique / Pascal
if trouve = 'N' then tele :=0;
close (rep); (* fermeture de rep *)
END;
PROGRAM principal;
uses wincrt;
(* -----PROGRAMME PRINCIPAL UTILISANT LA PROCEDURE CONSREPS ---------- *)
type composant = RECORD
nom:string[25];
notel:longint;
END;
r =FILE OF composant;
ch=string[50];
var repertoire:r; (* Declaration du fichier repertoire *)
nomcorr:ch;
chem:string;
telephone:longint;
{$i E:\algo\modules\consreps.pro}
BEGIN
write('SVP ! donner le chemin d''acces de votre fichier: ');
readln(chem);
writeln('**** CONSULTATION EN ACCES SEQUENTIEL DU FICHIER REPERT ******');
write( ' Donnez le nom du correspondant : ');
readln(nomcorr);
consreps(repertoire,chem,nomcorr,telephone);
if telephone <> 0 then writeln('son numero de telephone est : ',telephone)
else writeln('Correspondant non existant dans le repertoire');
readln;
END.

RESULTATS

RECHERCHE EN DIRECT DUN CORRESPONDANT A PARTIR DE SA POSITION

ANALYSE : On se dplace directement la position donne et on met le nom dans Nom et le numro de
tlphone dans Tele.

CHERGOU B. 7 page :
ESI Cours : Algorithmique / Pascal
PROCEDURE consrepd(var rep:r;chemin:string;position:integer;Var nom:ch;var tele:longint);
(* ---- PROCEDURE DE CONSULTATION EN ACCES DIRECT DU FICHIER REPERT
on donne la position du correspondant et elle retourne le nom et
un numero de telephone ou zero dans le cas ou le nom n'existe pas -- *)
var article:composant;
BEGIN
assign(rep,chemin); (* assignation entre rep et f1.dat *)
reset(rep); (* ouverture de rep *)
seek(rep,position-1);
read(rep,article);
nom := article.nom;
tele := article.notel;
close (rep); (* fermeture de rep *)
END;

PROGRAM principal;
uses wincrt;
(* ----- PROGRAMME PRINCIPAL UTILISANT LA PROCEDURE CONSREPD ---- *)
type composant = RECORD
nom:string[25];
notel:longint;
END;
r =FILE OF composant;
ch=string[25];
var repertoire:r; (* Declaration du fichier repertoire *)
nomcorr:ch;
pos,telephone:longint;
chem:string;
{$i E:\algo\modules\consrepd.pro}
BEGIN
write('SVP ! donner le chemin d''acces de votre fichier: ');
readln(chem);
writeln('**** CONSULTATION EN ACCES DIRECT DU FICHIER REPERT ********');
write( 'Donnez la position du correspondant : ');
readln(pos);
consrepd(repertoire,chem,pos,nomcorr,telephone);
writeln('Le nom de votre correspondant est : ',nomcorr , ' et son telephone : ', telephone);
readln;
END.
readln;
END.

Merci de faire parvenir vos observations, remarques : B_Chergou@esi.dz

CHERGOU B. 8 page :

Vous aimerez peut-être aussi