Abstraction Concrète : Module Fixe


Les fonctions d'entrées sorties de base sont implémentées par les bibliothèques io et sys

Implémentation de fichiers d'enregistrements en longueur fixe :

A l'ouverture de fichier en entrée ou en sortie, le système peut déclencher une exception sys__Sys_error of string. La chaîne de caractères associée à sys__Sys_error contient un message précisant l'erreur rencontrée. Lorsque l'on tente d'accéder au delà de la fin du fichier, l'exception End_of_file est déclenchée. Et lorsque l'on tente d'accéder au delà du début du fichier, l'exception Start_of_file est déclenchée. L'exception End_of_file est pré définie dans le module de bibliothèque io. On définit l'exception Start_of_file dans le module d'interface. L'exception sys__Sys_error est pré définie dans le module de bibliothèque sys.
Le type fichier du module interface comporte un champ nommé id pour indiquer la chaîne de caractères du chemin d'accés au fichier, un champ lzone pour mentionner la longueur fixe de l'enregistrement, un champ mutable pzone pour conserver le numéro de l'enregistrement courant, et un champ mutable c pour conserver le canal du fichier.

La fonction taille f retourne le nombre de caractères du fichier.
La fonction nombre_enregistrements f retourne le nombre d'enregistrements du fichier.
La fonction zonetmp f retourne une chaîne d'espaces de la longueur de l'enregistrement définie par le champ f.lzone dans l'enregistrement de type fichier f.
La fonction creer nom l crée un fichier f. La fonction ouvrir f ouvre un fichier f existant. La fonction fermer f ferme le fichier f.

A) mode séquentiel :

On accède aux enregistrements à partir de la position courante du pointeur d'enregistrement. A l'ouverture, le pointeur d'enregistrement est placé au début du premier enregistrement.

La fonction ecrire_courant f str écrit la chaîne str dans l'enregistrement courant du fichier indiqué par f.id. Et la fonction ajouter f str écrit la chaîne str dans un nouvel enregistrement en fin du fichier f.id. Si la longueur de la chaîne str dépasse celle de l'enregistrement (indiquée par f.lzone) celle-ci est tronquée à droite à la longueur fixée. Si la longueur de la chaîne str est inférieure à f.lzone celle-ci est complétée à droite par des espaces jusqu'à la longueur fixée.
La fonction lire_courant f retrouve l'enregistrement courant du fichier f.id et retourne une chaîne contenant cet enregistrement, à la longueur fixée par f.lzone.
La fonction suivant f place le pointeur f.pzone sur l'enregistrement suivant dans le fichier f.id.
La fonction precedent f place le pointeur f.pzone sur l'enregistrement précédent dans le fichier f.id.

B) mode direct :

Avec le mode direct, on accéde aux enregistrements en indiquant leur numéro. Lorsque l'on indique un numéro supérieur à celui du dernier enregistrement, on accède au dernier enregistrement. Et lorsque l'on indique un nombre négatif comme numéro d'enregistrement, on accède au premier enregistrement.

La fonction ecrire_position f n str écrit la chaîne str dans l'enregistrement numéro n du fichier indiqué par f.id. Si la longueur de la chaîne str dépasse celle de l'enregistrement (indiquée par f.lzone) celle-ci est tronquée à droite à la longueur fixée. Si la longueur de la chaîne str est inférieure à f.lzone celle-ci est complétée à droite par des espaces jusqu'à la longueur fixée.
La fonction lire_position f n retrouve l'enregistrement numéro n du fichier f.id et retourne une chaîne contenant cet enregistrement, à la longueur fixée par f.lzone.
La fonction premier f place le pointeur f.pzone sur le premier enregistrement du fichier f.id, et retourne la valeur du pointeur.
La fonction dernier f place le pointeur f.pzone sur le dernier enregistrement du fichier f.id, et retourne la valeur du pointeur.
La fonction pointer f n place le pointeur f.pzone sur l'enregistrement numéro n du fichier f.id, et retourne la valeur du pointeur.
La fonction num_courant f retourne la valeur du pointeur d'enregistrement courant f.pzone du fichier f.id.


Exemple de session


(* création du fichier *)
#let fic = creer "essai.txt" 32 ;;
fic : fichier = 
        {id="essai.txt"; lzone=32; pzone=0; c=}

(* écriture d'enregistrements *)
#ecrire_courant fic 
  "0000000000111111111122222222223333333333" ;;
- : unit = ()
#ajouter fic 
  "0123456789012345678901234567890123456789" ;
 ajouter fic "ANUBIS dieu des morts" ;
 ajouter fic "ISIS deesse epouse d'Osiris" ;;
- : unit = ()

(* lecture d'enregistrements *)
#lire_position fic 0 ;;
- : string = "00000000001111111111222222222233"
#lire_position fic 3 ;;
- : string = "ISIS deesse epouse d'Osiris     "
#lire_position fic 1 ;;
- : string = "01234567890123456789012345678901"
#lire_position fic 2 ;;
- : string = "ANUBIS dieu des morts           "

(* écriture d'enregistrements *)
#ajouter fic "OSIRIS dieu du bien et de la vie" ;
 ajouter fic "HORUS dieu solaire" ;
 ajouter fic "AMMON dieu egyptien de Thebes" ;
 ajouter fic "RA dieu egyptien du soleil" ;;
- : unit = ()

(* information fichier *)
#num_courant fic ;;
- : int = 7
#nombre_enregistrements fic ;;
- : int = 8
#taille fic ;;
- : int = 256

(* lecture d'enregistrements *)
#precedent fic ;;
- : int = 6
#lire_courant fic ;;
- : string = "AMMON dieu egyptien de Thebes   "
#suivant fic ;;
- : int = 7
lire_courant fic ;;
- : string = "RA dieu egyptien du soleil      "
#premier fic ;;
- : int = 0
#dernier fic ;;
- : int = 7
#lire_position fic 4 ;;
- : string = "OSIRIS dieu du bien et de la vie"
#suivant fic ;;
- : int = 5
#for i = 0 to (nombre_enregistrements fic - 1) do
  print_string (lire_position fic i) ;
  print_newline () ; flush stdout done ;;
00000000001111111111222222222233
01234567890123456789012345678901
ANUBIS dieu des morts           
ISIS deesse epouse d'Osiris     
OSIRIS dieu du bien et de la vie
HORUS dieu solaire              
AMMON dieu egyptien de Thebes   
RA dieu egyptien du soleil      
- : unit = ()