Les fichiers
1. Motivation
2.Qu' 'est-ce qu'un fichier?
3.Types de fichier.
4. déclaration d'un fichier.
5.Principales commandes sur les fichiers.
6. Exemples d'utilisation d'un fichier.
7. Commandes additionnelles.
******************************************
1. Motivation
Toutes les structures de données que nous avons vues ont un point commun: elles résident toutes dans la mémoire principale de l'ordinateur. Ceci signifie que l'effacement (volontaire ou non!) de la
mémoire provoque la destruction de ces structures.
D'autre part il peut être nécessaire de conserver certaines données après la fin du programme les ayant créées, ceci en prévision d'une utilisation future.
Ces considérations nous amènent à introduire la notion de fichier disque.
Les fichiers de disque permettent de stocker des informations de manière permanente, sur un support externe une disquette ou un disque dur…
2.Qu'est-ce qu'un fichier?
Hors du monde informatique :un fichier est une collection de fiches.
Pour trouver une fiche il faut parcourir le fichier fiche après fiche ou utiliser une clé d'accès .
En informatique : un fichier est une structure de données toutes de même type mais dont le nombre n'est pas connu à priori. L'accès à un élément (à une donnée) du fichier se fait
- séquentiellement c-à-d en parcourant le fichier élément par élément depuis le début jusqu'à l'élément choisi
- directement en donnant la position de l'élément cherché.
- selon une clé chaque valeur de la clé désignant un élément . Un fichier possède:
• un identifiant (nom)
• un emplacement (lié au support)
• un contenu (données).
3.Types de fichiers : Ils se répartissent en deux catégories: selon le type d données qu’il contient.
- données de type enregistrement : fichier binaire (contient la structure de l’enregistrement) - données de type caractère : fichier texte
4.Déclaration d’un fichier
Type
nombre_complexe = record (* nombre complexe *) partie_reelle : real;
partie_imaginaire : real;
end;
fichier_entiers = file of integer;
fichier_nombres_complexes = file of nombre_complexe;
var
int_1, int_2 : integer;
nombre_1,nombre_2 : nombre_complexe;
fichier_int : fichier_entiers;
fichier_complexe : fichier_nombres_complexes;
Exemples:
const long_max_nom = 30;
long_max_titre = 40
type t_fich_entiers = file of integer;
t_fich_reels = file of real;
t_auteur_livre = string [ long_max_nom ];
t_titre_livre = string [ long_max_titre ];
t_livre_cote = record (* une fiche bibliographique *) nom_auteur : t_auteur_livre;
titre : t_titre_livre;
cote : integer;
end;
t_fichier_biblio = file of t_livre_cote;
var fichier_reponses : t_fich_entiers;
fichier_mesures : t_fich_reels;
bibliotheque : t_fichier_biblio;
Remarque :
Il existe un type fichier prédéfini: text .
Il existe deux (variables) fichiers prédéfinis: input et output de type text . 5.Principales commandes sur les fichiers
la notion d’identifiant de fichier :
nom externe : c’est le nom du fichier pour le système de fichier du système d’exploitation considéré, par exemple : mon_fichier.dat
nom interne : c’est le nom du fichier connu par le programme, il est déclaré par le programme, par exemple : Fichier_de_données
* nécessité d’associer le fichier physique à sa représentation interne : commande Assign 5. 1. Assignation physique :
assign ( < File >, < nom du fichier réel >);
• Exemples d’associations par assign : var Destination: String ;
FOrigine, FDestination: FILE OF Integer ; assign ( FOrigine, 'C:\DATA\Infile.Dat' );
readln ( Destination );
assign ( FDestination, Destination );
5. 2 • Indicateur de fin de fichier :
Eof ( < File > ) ; (Valeur booléenne, True / False) 5. 3• Procédures prédéfinies
Soit la variable exemple d'un type fichier quelconque. Les procédures applicables à exemple sont les suivantes:
rewrite ( exemple ) : ouvre le fichier exemple en écriture et l'initialise à la valeur "fichier vide" (le
fichier ne contient que la marque de fin de fichier).La fonction eof ( exemple ) est alors vraie.
reset ( exemple ) : ouvre le fichier exemple en lecture et positionne la fenêtre sur le premier élément. Si le fichier est vide la fonction eof ( exemple ) est vraie.
close ( exemple ) : ferme le fichier exemple .
read (exemple, donnee) : lit dans donnee l'élément suivant du fichier exemple write (exemple, donnee) : écrit la valeur de donnee à la fin du fichier exemple.
Lecture ou écriture :
On ouvre un fichier soit en lecture, soit en écriture. On ne peut pas faire les deux en même temps.
En lecture : on fait reset(f); puis des read(f, ...);
En écriture : on fait rewrite(f); puis des write(f, ...);
Si le fichier n'existe pas, un rewrite le crée. Si il existe déja, le rewrite l'écrase, c'est- a-dire que l'ancien contenu est définitivement perdu.
Fin du fichier
En lecture, avant de faire un read, il faut tester si il y a encore quelque chose à lire ; on n'a pas le droit de faire un read si la fin du fichier est atteinte.
La fonction eof(f) retourne true si la fin du fichier est atteinte.
6.Exemple d’utilisation d’un fichier typé
6. 1.Lecture d’un fichier de nombres réels et calcul de leur somme TYPE FichierSequentiel = FILE OF Real ;
VAR F: FichierSequentiel;
FUNCTION SommeFichierReel ( VAR Fichier: FichierSequentiel ): Real;
VAR X, S: Real ; BEGIN
S:=0;
WHILE NOT Eof ( Fichier ) DO BEGIN Read ( Fichier, X );
S := S + X
END ; (* -- WHILE, Eof( Fichier ) *) SommeFichierReel := S
END ; (* -- SommeFichierReel *) . . .
BEGIN
Assign ( F, 'C:\REELS.DAT' );
Reset ( F ); {* ouverture du fichier en mode lecture *) Writeln ( SommeFichierReel( F ) );
Close ( F ) END .
6. 2.Mettre un vecteur vec de nb éléments dans un fichier.
Program essai ; VAR
vec : array [1..vmax] of element_t;
nb, i : integer;
BEGIN
assign (f, nomf);
rewrite (f);
for i := 1 to nb do write (f, vec[i]);
close (f);
END;
6. 3.Copie d’un fichier binaire dans un autre
Program copie_de_fichiers (input, output, original, copie);
Const long_max_nom = 30; (* nombre maximal de caractères d’un nom *) long_max_titre = 80; (* nombre maximal de caractères d’un titre *)
Type t_auteur_livre = string [ long_max_nom ];
t_titre_livre = string [ long_max_titre ];
t_livre = record (* représente une fiche bibliographique *) titre : t_titre_libre; (* titre du livre *)
auteur : t_auteur_livre; (* nom de l'auteur *) ISBN : integer; (* cote en bibliothèque *) annee : integer; (* année de parution *) end;
t_fichier_biblio = file of t_livre;
Var original : t_fichier_biblio; (* fichier à copier *) copie : t_fichier_biblio; (* copie à créer *)
livre : t_livre ;
Begin (* copie_de_fichiers *)
assign (original, 'Original.dat'); (* association au fichier d’origine *) assign (copie, 'Copie.dat'); (* association au fichier duplicata *) reset (original); (* ouvrir le fichier à copier *)
rewrite (copie); (* initialiser la copie *)
while not eof (original) do (* parcourir le fichier à copier *) begin
read ( original , livre) ; (* copier l'élément courant d'une fenêtre dans l'autre *) write(copie , livre); (* écrire l'élément copié *)
end; (* while not eof (original) *)
close (original); close (copie); (* fermeture en fin de programme *) End. (* copie_de_fichiers *)
7. Commandes additionnelles :
filepos ( < File > ); (* position actuelle du repère *)
filesize ( < File > ); (* taille du fichier en enregistrements *) erase ( < File > ); (* efface le fichier File *)
rename ( < File >, < nouveau_nom > ); (* renomme le fichier *) : ces deux dernières commandes nécessitent que le fichier soit fermé avant de pouvoir être utilisées
seek ( < File >, < Num > ); (* positionne le repère sur l’enregistrement de numéro Num *) Exemple : Accès direct à un enregistrement dans un fichier par la commande seek (* déclarations de types *)
var BU : t_fichier_biblio;
Courant : t_livre;
Num : integer;
begin
(* assignation *) + (* ouverture *) reset (BU);
repeat
writeln ('quel est le numéro de l’enregistrement ?'); readln (Num);
until Num in [0..filesize(BU)-1];
seek (BU, Num);
read (BU, Courant);
with Courant do
writeln (titre, '/', auteur, '/', annee, '/', ISBN);
close (BU);
end.