Cours Fichiers 2013

Transcription

Cours Fichiers 2013
Fichiers


Introduction
Fichier texte





Présentation
Le type TEXT
Primitives de gestion
Exemple
Fichier structuré




Présentation
Le type FILE OF
Primitives de gestion
Exemple
Compléments d’algorithmique
1
Introduction

Définition (Fichier) :

Un fichier est une structure de données contenant une suite d’éléments en
mémoire secondaire.

Suite : Les éléments sont rangés dans un ordre bien précis.

Mémoire secondaire : Stockage sur support physique pour la
conservation des données. Disque dur, disquette, clé USB, etc.

Utilisation :

On stocke des données dans un fichier (plutôt qu’en mémoire vive) quand
on souhaite conserver ces données. Les données stockées en mémoire
(vive) sont perdues quand le programme se termine, alors que les données
stockées en mémoire secondaire sont conservées.
Compléments d’algorithmique
Fichiers : introduction
2
Introduction : avantages




Conserver des données, avec possibilité de les copier sur d’autres
supports pour sauvegarde.
Stockage de grandes quantités de données : plusieurs méga-octets
(2201 million) ou giga-octets (230 1 milliard)
La taille d’un fichier n’est pas fixée a priori, et peut varier en cours
d’utilisation.
Facilite la mise au point d’un programme qui demande des données en
entrée. Plutôt que de saisir ces données à chaque exécution, les
données sont lues dans le fichier.
Compléments d’algorithmique
Fichiers : introduction
3
Introduction : Nom physique

Définition (Nom physique) :





Tout fichier a un nom physique qui identifie de façon unique le fichier, et
donne son lieu de stockage. Ce nom physique est une chaîne de
caractères.
La forme du nom physique peut varier selon le système d’exploitation.

Sous Unix/Linux : /<nomrepertoire>/<nomsousrep>/.../<nomfichier>
 Exemple: /home/user/ChosesAFaire

Sous Windows : <Lecteur>:\<nomrep>\<nomsousrep>\...\<nomfic>.<ext>
 Exemple: A:\cours\complementAlgo.txt
Le lecteur (une lettre) donne l’unité de stockage. Ex: C: disque dur
principal, D: disque dur secondaire, E: DVD, F: USB...
L’extension décrit le type de fichier (txt pour un fichier texte, pas pour
un fichier source Pascal, exe pour un programme exécutable…).
Pour éviter les problèmes : ne pas utiliser de caractère « espace »,
caractère accentué ou caractère spécial (; + * ? . . . ) dans les noms de
fichiers ou de répertoires
Compléments d’algorithmique
Fichiers : introduction
4
Introduction : accès/position courante

Définition (Accès séquentiel) : Chaque élément du fichier est lu en
séquence, c’est à dire dans l’ordre d’apparition dans le fichier.


Définition (Accès direct) : Chaque élément du fichier peut être lu
directement, quelle que soit sa place dans le fichier.



Pour lire l’élément n, on doit lire tous les éléments numérotés 1 à n − 1.
Un tableau est une structure de données à accès direct.
L’accès direct est souvent préférable, car plus performant. Mais dans
certains cas (pour lire la totalité du fichier par exemple), l’accès séquentiel
suffit.
Définition (Position courante dans le fichier) : La position courante
dans un fichier est le numéro du prochain élément qui sera lu ou écrit
dans le fichier.


On parle parfois de tête de lecture/écriture.
Il s’agit de la même idée qu’une variable qui contient l’indice dans un
tableau.
Compléments d’algorithmique
Fichiers : introduction
5
Fichier texte : présentation

Un fichier texte est un fichier qui contient du texte, c’est à dire :



un ensemble de caractères (lettres, chiffres, symboles spéciaux)
organisé en lignes. Chaque ligne est terminée par une marque de fin de
ligne eoln (end of line).
Un fichier texte est terminé par une marque de fin de fichier eof (end of
file). Un fichier texte peut être créé et lu dans un traitement de texte
(en utilisant la sauvegarde en « texte brut ») ou dans un éditeur de
texte (tel que l’éditeur de Lazarus, Delphi ou EDI
Pascal).Compléments
Compléments d’algorithmique
Fichier texte
6
Le type TEXT


Le langage Pascal permet de créer, lire, écrire des fichiers textes. Pour
manipuler un fichier texte en Pascal, on déclare une variable d’un type
spécifique : le type TEXT.
Définition (Nom logique) : Le nom logique d’un fichier est la variable de
type TEXT qui permet de manipuler le fichier.


(par opposition au nom physique qui est une chaîne de caractères qui
donne l’emplacement du fichier)
Définition (Primitives de gestion) : Toutes les manipulations sur un
fichier se font par des appels à des sous-programmes, appelés
primitives de gestion, qui prennent comme paramètre le nom logique
du fichier.
Compléments d’algorithmique
Fichier texte
7
Primitives de gestion

Ces primitives de gestion concernent :


La gestion de fichiers
 Ouverture, (pour lire ou écrire dans un fichier, il est nécessaire
de l’ouvrir)
 Fermeture, (quand on a fini d’utiliser un fichier, il peut être
fermé)
 . . .
L’utilisation de fichiers
 Lecture,
 Écriture,
 . . .ments
Compléments d’algorithmique
Fichier texte
8
Primitives de gestion



Soit f une variable de type TEXT, nom logique du fichier.
Soit nomf une expression de type string contenant le nom
physique du fichier.
Primitive d’association : fait le lien entre le nom physique et
le nom logique. Une fois que l’association est faite, les
autres primitives peuvent être utilisées sur le nom logique.
Syntaxe :
f: TEXT;
Fnom: string;
…
Assign(f, fnom);


Le nom physique n’est utilisé par aucune autre primitive.
Par la suite, f sera le nom logique du fichier à traiter.
Compléments d’algorithmique
Fichier texte
9
Primitives de gestion





Si le fichier n’existe pas sur le support physique, le fichier est créé
à vide,
sinon, il est vidé de son contenu.
Après rewrite, on peut uniquement écrire dans le fichier.
Ouverture en exploitation




Syntaxe :
rewrite(f);
Ouverture en création
Syntaxe
: reset(f);
Ouvre le fichier. Si le fichier n’existe
pas,
une erreur se produit.
Positionne la tête de lecture sur le premier caractère du fichier.
Après un appel à reset, on peut uniquement lire dans le fichier.
Ouverture en ajout


Syntaxe :laappend(f);
Ouvre le fichier, et positionne
tête d’écriture sur la marque de fin
de fichier, afin d’écrire de nouveaux éléments dans le fichier.
Après append, on peut uniquement écrire dans le fichier.
Compléments d’algorithmique
Fichier texte
10
Primitives de gestion

Fin de ligne





Fonction qui retourne un booléen
eoln retourne vrai si et seulement si la tête de lecture est sur une
marque de fin de ligne (ou sur la marque de fin de fichier).
Fin de fichier

Syntaxe : eoln(f);
Syntaxe : eof(f);
Fonction qui retourne un booléen
eof retourne vrai si et seulement si la tête de lecture est sur la
marque de fin de fichier.
Fermeture du fichier

Syntaxe : close(f);
Ferme le fichier (quel que soit le mode d’ouverture utilisé)
Compléments d’algorithmique
Fichier texte
11
Primitives de gestion

Écriture




Écrit un texte dans le fichier.
expr est une expression de type caractère, booléen, entier, réel ou
chaîne de caractères.
Le fichier doit être préalablement ouvert dans un mode qui permet
l’écriture (append ou rewrite)
Écriture avec fin de ligne



Syntaxe : write(f,expr);
Syntaxe : writeln(f,expr);
Ecrit un texte dans le fichier. Après le texte, la primitive rajoute une
marque de fin de ligne au fichier.
Il est équivalent d’écrire :
 write(f,ex); writeln(f); et writeln(f,ex);
Paramètres
Comme dans le cas de l’écriture à l’écran, write et writeln dans
des fichiers peuvent prendre plus de paramètres :
 write(f,ex1,ex2);
 write(f,ex1); write(f,ex2);
Compléments d’algorithmique
12
Fichier texte

Primitives de gestion

Lecture


Lecture d’un caractère



Pour lire dans un fichier, la tête de lecture ne doit pas être sur la marque de
fin de fichier, et le fichier doit être ouvert en lecture (reset).
Syntaxe : read(f,x);
x est une variable de type char.
Lit le caractère situé sous la tête de lecture, et le stocke dans x. La tête de
lecture est avancée d’un caractère.
Lecture d’un entier (idem pour un réel)





Syntaxe : read(f,x);
x est une variable de type integer.
Lit l’entier situé dans le fichier à partir de la position donnée par la tête de
lecture, et le stocke dans x.
Espaces, tabulations, fin de lignes sont ignorés avant la lecture de l’entier.
Si il n’y a pas d’entier trouvé, erreur à l’exécution.
Après l’exécution de la primitive, la tête de lecture est positionnée juste
après l’entier.
Compléments d’algorithmique
Fichier texte
13
Primitives de gestion
Exemple (fichier.txt) :
15 12
42 blabla
ml-abc63texte
autre_texte
Exemple (lecture) :
program test;
var f: TEXT; e: integer; s: string;
begin
assign(f, ’fichier.txt’);
reset(f);
read(f, e); writeln(e);
read(f, e); writeln(e);
read(f, e); writeln(e);
end.
Compléments d’algorithmique
Fichier texte
14
Primitives de gestion

Lecture d’une chaîne




Syntaxe : read(f,x);
x est une variable de type string
Lit les caractères dans le fichier à partir de la position de la tête de lecture,
jusqu’à la prochaine marque de fin de ligne. Les caractères lus sont
stockés dans x.
La tête de lecture est ensuite positionnée sur la marque de fin de ligne.
read permet de lire tout type de chaîne. Si on rajoute read(f, s) au
programme précédent, s prend la valeur ’blabla’.

Lecture d’une fin de ligne

Ignore la marque de fin de la ligne courante.

La tête de lecture est déplacée jusqu’au caractère suivant la prochaine fin
de ligne. Les caractères qui prédèdent la fin de ligne sont ignorés.
Lecture dans une variable + fin de ligne Syntaxe : readln(f,x);
Syntaxe : readln(f);



Équivalent à read(f,x); readln(f);
Read,readln: nbre variable de paramètres. Ex : read(f,v1,v2);
Compléments d’algorithmique
Fichier texte
15
Primitives de gestion : exemple

On désire lire le fichier (etud.txt) ci-dessous pour extraire les noms
des étudiants inscrits en L1, et stocker ces noms dans un fichier
nommé etudl1.txt. Le fichier etud.txt contient, pour chaque
étudiant, sur des ligne séparées :



le nom,
la formation,
l’année de première inscription à l’université.
Exemple (etud.txt) :
Dupont Alexis
L1
2008
Azerty Caroline
L2
2006
Qwerty Bob
L1 …
Compléments d’algorithmique
Exemple (etudl1.txt) :
Dupont Alexis
Qwerty Bob
…
Fichier texte
16
Primitives de gestion : exemple
Exemple :
program fich_etud;
var entree, sortie: TEXT;
nom, formation: string; annee: integer;
begin
assign(entree, ’etud.txt’);
reset(entree);
assign(sortie, ’etudl1.txt’);
rewrite(sortie);
while not(eof(entree)) do
begin
readln(entree, nom);
readln(entree, formation);
readln(entree, annee);
if formation = ’L1’ then writeln(sortie, nom);
end;
close(sortie);
close(entree);
end.
Compléments d’algorithmique
Fichier texte
17
Fichier structuré : présentation



Un fichier structuré est un fichier qui contient des éléments de même
type.
Le type des éléments peut être :

Simple (entier, chaine, etc.)
 Ex: Stocker des relevés de températures : les éléments sont des real.

Composé (enregistrement, tableau)
type Etudiant = record
nom : string[20];
 Ex: Un fichier contenant des
formation : string[20];
enregistrements, pour stocker
annee : integer;
des informations sur les étudiants : end;
 Fichier dont les éléments sont des enregistrements de type Etudiant
Un fichier structuré

…est terminé par une marque de fin de fichier eof.

…ne peut pas être édité avec un éditeur ou traitement de texte.
Compléments d’algorithmique
Fichier structuré
18
Fichier structuré : le type FILE OF

L’exploitation d’un fichier structuré se fait par l’intermédiaire d’une
variable d’un type particulier, appelée nom logique.


Comme pour un fichier texte
Habituellement, quand on doit manipuler des types dont la définition
est complexe (tableau, enregistrement), on utilise une déclaration de
type.
Syntaxe : type NomType = FILE OF TypeElement;

Après cette déclaration de type, on peut déclarer des variables de type
NomType, qui seront des noms logiques de fichiers structurés dont les
éléments seront tous des TypeElement.
Syntaxe : var f1, f2: NomType;
Compléments d’algorithmique
Fichier structuré
19
Fichiers structurés : primitives de gestion

Association :






Syntaxe : assign(f,nomf);
Soit f une variable de type FILE OF TypeElement, nom logique du
fichier à traiter.
Soit nomf une expression de type string contenant le nom physique du
fichier.
Syntaxe : comme sur un fichier texte!
Par la suite, f sera le nom logique du fichier à traiter.
Ouverture en création
Syntaxe : rewrite(f);

Exactement comme sur un fichier texte, mais permet lecture ET écriture.
Syntaxe : reset(f);
Ouverture en exploitation


Exactement comme sur un fichier texte, positionne la tête de
lecture/écriture sur le premier élément du fichier, et permet lecture ET
écriture.
Il n’est pas possible d’utiliser append sur un fichier structuré.
Compléments d’algorithmique
Fichier structuré
20
Fichiers structurés : primitives de gestion


Il n’y a pas de fin de ligne dans un fichier structuré, eoln
ne peut pas être utilisé.
Fin de fichier

Exactement comme sur un fichier texte
Syntaxe : eof(f);

Fermeture du fichier

Exactement comme sur un fichier texte
Syntaxe : close(f);
Compléments d’algorithmique
Fichier structuré
21
Fichiers structurés : primitives de gestion

Écriture


Syntaxe : write(f,expr);
f est une variable de type FILE OF TypeElement et expr une
expression de type TypeElement
Si la tête de lecture/écriture est positionnée sur la marque de fin de
fichier:
 la valeur de expr est écrite à la place de la marque de fin,
la marque de fin est placée après ce nouvel élément.
 la tête de lecture est positionnée sur la marque de fin.
Sinon :
 la valeur de expr est écrite à la place de la valeur située sous
la tête de lecture/écriture,
 la tête de lecture est avancée sur l’élément suivant.
Il n’y a pas de fin de ligne dans un fichier structuré, writeln ne
doit pas être utilisé.Compléments d’algorithmique



Compléments d’algorithmique
Fichier structuré
22
Fichiers structurés : primitives de gestion

Lecture
Syntaxe : read(f,x);

f est une variable de type FILE OF TypeElement

x une variable de type TypeElement.

Une copie de l’élément situé sous la tête de lecture est stockée
dans x. La tête de lecture est avancée jusqu’à l’élément suivant.

Pour lire dans un fichier, la tête de lecture ne doit pas être sur la
marque de fin de fichier.
Compléments d’algorithmique
Fichier structuré
23
Fichiers structurés : primitives de gestion

Taille




fonction qui retourne un entier (longint) qui est le nombre
d’éléments du fichier f.
Position

Syntaxe : filesize(f);
Syntaxe : filepos(f);
fonction qui retourne un entier (longint) qui est le numéro de
l’élément du fichier f situé sous la tête de lecture/écriture.
Les éléments sont numérotés de 0 à filesize(f) - 1.
Positionnement
Syntaxe : seek(f,pos);
pos est un entier compris entre 0 et le nombre d’éléments du fichier
f.
 Si 0  pos < filesize(f), positionne la tête de
lecture/écriture sur l’élément numéro pos.
 Si pos = filesize(f), positionne la tête de
lecture/écriture sur la marque de fin de fichier.
 Sinon, erreur à l’exécution.nts
Compléments d’algorithmique
24
Fichier structuré

Exemple: présentation

On désire gérer les listes d’inscriptions d’étudiants à des
formations. Pour chaque étudiant on doit mémoriser




numéro INE,
nom,
formation.
Le programme doit disposer des fonctions suivantes :




Saisie d’un étudiant et sauvegarde.
Affichage des étudiants inscrits.
Recherche d’un étudiant par son numéro INE :
 Est-ce que cet étudiant existe dans la base ?
 Quel est le nom et la formation de l’étudiant ?
Trier les étudiants par leur numéro INE.
Compléments d’algorithmique
Fichier structuré
25
Exemple : types
Exemple :
program baseetud;
type Etudiant = record
ine : integer;
nom : string[20];
formation : string[20];
end;
type FichierEtudiant = file of Etudiant;
Compléments d’algorithmique
Fichier structuré
26
Exemple : Saisie et sauvegarde
Exemple :
procedure saisie(var e: Etudiant);
begin
write(’ine ? ’); readln(e.ine);
write(’nom ? ’); readln(e.nom);
write(’formation ? ’); readln(e.formation);
end;
/* Ajoute l’etudiant e dans le fichier f */
procedure ajouter(var f: FichierEtudiant; e: Etudiant);
begin
seek(f, filesize(f));
write(f, e);
end;
Compléments d’algorithmique
Fichier structuré
27
Exemple : Affichage
Exemple :
/* Affiche a l’ecran le contenu du fichier f */
procedure afficher(var f: FichierEtudiant);
var e: Etudiant;
begin
seek(f, 0);
while not(eof(f)) do
begin
read(f, e);
writeln(e.ine, ’ ’, e.nom, ’ ’, e.formation);
end;
end;
Compléments d’algorithmique
Fichier structuré
28
Exemple: Recherche d’un étudiant



Est-ce que cet étudiant existe dans la base ?
Quel est le nom et la formation de l’étudiant ?
Ce qui est commun aux deux modes de recherche :
Parcours du fichier et arrêt quand l’étudiant est trouvé.
/* Positionne la tete de lecture de f sur l’etudiant
ine, ou sur eof si l’etudiant est introuvable. */
procedure positionSur(var f:FichierEtudiant; ine:integer);
var e: Etudiant; trouve: boolean;
begin
trouve := false;
seek(f, 0);
while not(trouve) and not(eof(f)) do
begin
read(f, e);
if e.ine = ine then trouve := true;
end;
if trouve then seek(f, filepos(f)-1);
end;
Compléments d’algorithmique
Fichier structuré
29
Exemple: Recherche d’un étudiant
function appartient(var f: FichierEtudiant; ine: integer):
boolean;
begin
positionSur(f, ine);
appartient := not(eof(f));
end;
/* Stocke dans resultat les informations sur l’etudiant
ine de f. Precondition : f doit contenir un etudiant dont
le numero est ine. */
procedure charger(var f: FichierEtudiant; ine: integer;
var resultat: Etudiant);
begin
positionSur(f, ine);
read(f, resultat);
end;

Passage de paramètres

Pour passer un fichier comme paramètre à un sous-programme, le
fichier doit être passé en paramètre donnée modifiée var. Même
dans une fonction.
Compléments d’algorithmique
Fichier structuré
30
Exemple : Trier les étudiants
procedure trier(var f: FichierEtudiant);
var i, j, taille, indicemin, inemin : integer;
etudianti, etudiantj : Etudiant;
begin
taille := filesize(f);
for i := 0 to taille-1 do
begin
seek(f, i); read(f, etudianti);
indicemin := i; inemin := etudianti.ine;
for j := i+1 to taille-1 do
begin
read(f, etudiantj);
if etudiantj.ine < inemin then
begin
inemin := etudiantj.ine; indicemin := j;
end;
end;
if indicemin <> i then echanger(f, i, indicemin);
end;
end;
Compléments d’algorithmique
Fichier structuré
31
Exemple : Trier les étudiants
/* Echange dans f les elements i et j */
procedure echanger(var f: FichierEtudiant; i, j: integer);
var eti, etj: Etudiant;
begin
seek(f, i);
read(f, eti);
seek(f, j);
read(f, etj);
seek(f, j);
write(f, eti);
seek(f, i);
write(f, etj);
end;
Compléments d’algorithmique
Fichier structuré
32
Exemple : programme principal
var f: FichierEtudiant; et: Etudiant;
begin
assign(f, ’etudiant.dat’);
/* rewrite(f); Pour creer le fichier */
reset(f); /* Pour ouverture du fichier existant */
/* Ajout d’un etudiant */
saisie(et); ajouter(f, et);
/* Affichage */
afficher(f);
writeln(inscrits(f, ’l1’), ’ inscrits en l1’);
/* Affichage du nom de l’etudiant d’INE 67 */
charger(f, 67, et); writeln(et.nom);
/* Affichage du tri */
trier(f); afficher(f);
close(f);
end.
Compléments d’algorithmique
Fichier structuré
33