Les fichiers

Généralités

Un fichier est une collection d'information structurée en unité d'accès appelé enregistrement.
Un fichier est toujours enregistré dans un support externe à la mémoire centrale (disque dur, disquette, clef USB ...).
L'accès aux différents éléments d'un fichier peut être soit séquentiel soit direct.

Déclaration d'un fichier

type
etudiant = record
matricule : string;
nom : string;
note : real;
end;
fichier = file of etudiant;

Remarque:

Un fichier une fois créé doit continuer à exister indépendamment du programme qui le construit. Chaque fichier a un nom physique ou chemin d'accès qui se présente sous la forme 'unité: nom_fichier.Extension'unité peut être A: B: C: D:
nom_fichier est constitué de 1 à 8 caractères.

extention de 0 à 3 caractères.

Exemple:

'C:\Etude.txt'
Le nom du fichier est spécifié par l'instruction assign.

Exemple:

assign(fichier, 'C:\etude.txt')

Exemple:

var F: file of etudiant;
begin
assign(F, 'A:\etude.txt');

L'accès séquentiel à un fichier

Pour l'accès séquentiel on parcourt le fichier élément par élément pour obtenir l'élément à traiter. Les primitives utilisées sont:

  • rewrite(fichier) permet d'ouvrir le fichier en écriture. Si le fichier existe déjà son ancien contenu devient inaccessible. Si le fichier n'existe pas encore, il sera tout simplement créé (pour l'instant il sera vide).
  • reset(fichier) permet l'ouverture du fichier en lecture ou en lecture écriture. Dans ce cas le fichier doit effectivement exister sinon il se produit une erreur d'exécution.
  • write(fichier, val) cette instruction permet d'écrire le contenu de val dans le fichier. Seulement val doit être du même type que les éléments du fichier.
  • read(fichier, val) cette instruction permet d'introduire un élément du fichier dans val.
  • eof(fichier) permet de détecter la fin du fichier. Cette fonction prend la valeur vraie si la fin du fichier a été atteinte.
  • close(fichier) permet de fermer le fichier à partir de là le fichier devient inaccessible.

Exemple:

program creation_fichier_etudiant;
type etudiant = record
matricule : string;
nom : string;
note : real;
end;
var fichir : file of etudiant;
personne : etudiant;

begin
assign(fichier, 'C:\etudiant.txt');
rewrite(fichier);
repeat
write('matricule: ')
readln(personne.matricule);
write('nom');
readln(personne.nom);
write('note: ');
readln(personne.note);
if length(personne.matricule) <> 0 then
write(fichier, personne);
until length(personne.matricule) = 0;
close(fichier);
end.

Exercice:

Ecrire un programme qui permet d'afficher la liste des informations des étudiants contenu dans 'C:\etudiant.txt'.

Solution:

var F:file of etudiant
program affiche per: etudiant
begin
assign(F, 'C:\etudiant.txt');
reset(F);
read(F, per);
while not (eof(F)) do
begin
writeln(per.matricule);
writeln(per.nom);
writeln(per.note);
read(F, per);
end;
close(F);
end.

 

Accès direct

 

Il est possible d'accéder directement à un élément du fichier lorsqu'on connaît son numéro.
La seule instruction nouvelle lors de l'accès direct est l'instruction seek(fichier, numéro) qui place la tête de lecture à l'élément donc le numéro a été indiqué.
Par convention les éléments d'un fichier sont spécifiés à partir de 00 et non à partir de 1
Exemple: seek(F,2)

  • filesize(fichier) renvoie le nombre d'élément.
  • filesize(fichier)-1 pour trouver le dernier élément.
  • seek(F, filesize(fichier)) pour placer le curseur à la fin du fichier.

Exemple:

procedure affiche_element(var F: fichier)
var val: etudiant; num: integer;
begin
assign(F,'C:\etudiant.txt');
reset(F);
writeln('Entrer un numéro: ');
repeat
write('Numéro = ');
readln(num);
until num <= filesize(F)
seek(F, num);
read(F, val);
writeln('Matricule: ',val.matricule);
writeln('nom: ', val.nom);
writeln('note: ',val.note);
close(F);
end;