Un fichier structuré est un fichier constitué d'enregistrements de même type.
Le type d'un enregistrement est à priori n'importe quel type Pascal de taille fixe. En effet, comme chaque enregistrement doit occuper la même taille en mémoire auxilliaire, on ne peut pas déclarer un fichier constitué de d'enregistrements de longueur variable. En particulier, le type String sera interdit et devra être remplacé par le type String[n] qui permet de préciser la taille de la chaine de caractères.
Pour la suite des explications, nous allons utiliser le type structuré Livre déclaré comme suit:
Livre = record Titre: String[100]; Auteur: String[20]; AnnéePub: integer; end;
Nous pouvons ensuite déclarer un fichier structuré composé d'enregistrements de type Livre comme suit:
var f : file of Livre;
Remarquez que le type des enregistrements d'un fichier structuré n'est pas forcément un type structuré. On peut par exemple déclarer un fichier d'entiers (file of integer) ou un fichier de caractères (file of char).
Tout comme pour les fichiers textes, avant d'ouvrir un fichier structuré il faut l'associer la variable représentant le fichier à un nom de fichier avec la procédure AssignFile.
Exemple:
AssignFile(f,'Bibliotheque.dat');
Cette instruction assigne f au fichier de nom "Bibliotheque.dat".
Pour ouvrir des fichiers structurés, on utilise encore les procédures reset et rewrite. Mais elles n'ont pas la même signification que pour les fichiers texte.
En effet, il sera toujours possible de lire et d'écrire des enregistrements, que le fichier soit ouvert avec reset (ouverture en lecture pour un fichier texte) ou avec rewrite (ouverture en écriture pour un fichier texte)
Pour les fichiers structurés rewrite n'est pas une ouverture en écriture. Cela signifie seulement que l'on demande au système d'exploitation de créer un nouveau fichier. Avec reset, on demande simplement l'ouverture, sans création d'un nouveau fichier.
Par contre, un fichier ne peut pas être ouvert avec reset s'il n'existe pas. Pour ouvrir un fichier structuré sans savoir auparavant s'il existe ou non, on utilisera la fonction FileExists (fonction permettant de tester l'existence d'un fichier de nom donné) de la manière suivante:
if FileExists('Bibliotheque.dat') then reset (f) else rewrite (f);
L'écriture d'un enregistrement se fait avec la procédure write. Plus précisément, write (f,v) écrit la valeur de la variable v dans le fichier f à la suite du dernier enregistrement lu ou écrit. Bien entendu, la variable doit être de même type que les enregistrements du fichier.
Si le fichier vient d'être ouvert, l'écriture se fait dans le premier enregistrement.
Déclarons par exemple deux structures de type Livre:
var VB, Gaston : Livre ;
Donnons des valeurs à leurs champs:
VB.Titre :='Visual Basic 6, Le guide du programmeur'; VB.Auteur :='Frantz'; VB.AnneePub :=2000; Gaston.Titre :='Gaston Lagaffe - Des Gaffes et des Dégats'; Gaston.Auteur :='Franquin'; Gaston.AnneePub :=1975;
Après les instructions suivantes:
AssignFile(f,'Bibliotheque.dat'); rewrite (f); write (f,Gaston); write (f,VB);
Le fichier "Bibliotheque.dat" contiendra deux enregistrements de type Livre. Plus précisément, le premier enregistrement contiendra le livre Gaston et le deuxième, le livre VB.
Si après cela on fait encore une fois
write (f,Gaston);
le fichier contiendra trois enregistrements (Gaston,VB,Gaston).
Si on écrit un enregistrement, juste après l'ouverture d'un fichier existant (donc avec un reset), cette écriture se fera dans le premier enregistrement du fichier. Par exemple, après l'exécution du code suivant:
AssignFile(f,'Bibliotheque.dat'); reset (f); write (f, VB);
le fichier contiendra (VB,VB,Gaston).
La lecture d'un enregistrement à la suite du dernier enregistrement lu ou écrit se fait par la procédure read. Plus précisément, pour affecter la valeur d'un enregistrement à une variable v on écrira read(f,v). Cela suppose bien entendu que la variable est du même type que les enregistrements du fichier.
Si le fichier vient d'être ouvert, l'enregistrement lu sera le premier.
Reprenons la suite de l'exemple précédent. Notre fichier Bibliotheque.dat contient à présent trois enregistrements de type Livre (VB,VB, Gaston).
Pour les récupérer, déclarons trois variables de type Livre:
var Livre1,Livre2, Livre3 : Livre;
après les instructions suivantes
AssignFile(f,'Bibliotheque.dat'); reset (f); read (f,Livre1); read (f,Livre2); read (f,Livre3);
les structures Livre1 et Livre2 contiendront le livre VB et Livre3 contiendra le livre Gaston.
De manière générale, on ne connait pas le nombre d'enregistrements contenus dans un fichier structuré. On utilise alors la fonction eof pour savoir si on est arrivé à la fin du fichier. Voici comment lire séquentiellement un fichier structuré afin d'effectuer un traitement sur chacun de ses enregistrements:
var f: file of type; x : type; AssignFile(f,'Bibliotheque.dat'); reset (f); while not eof (f) do begin read (f,x); Traitement de l'enregistrement x end;