• Aucun résultat trouvé

La manipulation des objets externes par le programme

QUELQUES RAPPELS

2. La manipulation des objets externes par le programme

Le mot fichier est parfois utilisé de façon ambiguë, car il désigne tantôt l'objet externe mémorisé sur un support magnétique (bande ou disque), tantôt l'entité manipulée par le programme. Pour éviter cette ambiguïté, le premier pourrait être appelé fichier physique et le second fichier logique. En général nous n'utiliserons le terme fichier que pour désigner la façon dont le programme manipule l'objet indépendamment de l'objet lui-même et des contraintes physiques d'implantation comme des caractéristiques du périphérique qui le supporte.

2.1. La notion de fichier

Le fichier est la façon dont un programme voit un objet externe. C'est d'abord une collection d'enregistrements logiques éventuellement structurée, sur laquelle le programme peut exécuter un ensemble d'opérations. Un enregistrement logique, encore appelé article, est l'ensemble minimum de données qui peut être manipulé par une seule opération élémentaire du fichier. Il est souvent constitué de diverses données élémentaires, que l'on peut décrire dans le langage de programmation utilisé, comme le montre la figure 7.1. Ces données élémentaires ne sont 66

accessibles individuellement par le programme que lorsque l'enregistrement logique est recopié dans un objet interne au programme. Dans cet exemple, le fichier est constitué d'une collection d'enregistrements qui ont la structure d'EMPLOYE. Les opérations sur le fichier permettent de transférer le contenu d'un tel enregistrement entre la mémoire interne du programme et l'objet externe qui lui est associé.

01 EMPLOYE 02 NOM PICTURE X(30) 02 PRENOM PICTURE X(20) 02 NUM-S-S 03 SEXE PICTURE 9 03 DATE-NAISSANCE 04 ANNEE PICTURE 99 04 MOIS PICTURE 99 03 LIEU-NAISSANCE 04 DEPARTEMENT PICTURE 99 04 CANTON PICTURE 999 03 ORDRE PICTURE 999 02 CODE-INTERNE PICTURE 9999

Fig. 7.1. Exemple de description en COBOL d'un enregistrement logique.

2.2. Le fichier séquentiel

La caractérisation des fichiers est déterminée par la nature des opérations que l'on peut effectuer sur le fichier. Le plus simple est le fichier séquentiel. Les opérations se résument, essentiellement, en la lecture de l'enregistrement suivant ou l'écriture d'un nouvel

du fichier, il n'est pas possible de mélanger les lectures et les écritures. Le fichier est alors un fichier séquentiel en lecture ou un fichier séquentiel en écriture.

Le fichier séquentiel en lecture est initialement positionné sur le premier enregistrement logique. Chaque opération de lecture (lire ou read) transfère dans une zone interne au programme un enregistrement du fichier, et prépare le fichier pour le positionner sur

l'enregistrement suivant. On dispose souvent d'une opération complémentaire qui permet de savoir s'il y a encore des enregistrements à lire dans le fichier (fin_de_fichier ou end_of_file), et éventuellement une opération permettant le retour au début du fichier (rembobiner ou

rewind).

Le fichier séquentiel en écriture peut être initialement vide, ou positionné après le dernier enregistrement déjà dans le fichier. Chaque opération d'écriture (ecrire ou write) rajoute un enregistrement dans le fichier depuis une zone interne au programme, et positionne le fichier après cet enregistrement. L'écriture d'un enregistrement se fait donc toujours après ceux qui sont déjà dans le fichier.

Noter que la caractéristique essentielle d'un fichier séquentiel est que les enregistrements sont lus dans l'ordre où ils ont été écrits. Aucune conversion des données n'est appliquée, soit parce qu'elle est faite par le programme, soit parce qu'elle n'est pas nécessaire.

2.3. Le fichier séquentiel de texte

Le fichier séquentiel de texte est analogue à un fichier séquentiel, mais avec conversion du format des données entre leur représentation interne et une représentation accessible à l'être humain. L'expression des opérations nécessitant la définition d'un format de conversion, la forme est très dépendante du langage de programmation. On peut assimiler un fichier séquentiel de texte à un fichier séquentiel où les enregistrements logiques sont en fait des caractères individuels.

En lecture, les opérations sur un tel fichier sont complétées par des opérations qui permettent de lire une donnée élémentaire, comme un entier, un nombre flottant, etc..., par conversion d'une suite de caractères lus depuis le fichier, suivant un certain format, implicite ou explicite. 67

En écriture, les opérations sur un tel fichier sont complétées par des opérations qui permettent d'écrire une donnée élémentaire, comme un entier, un nombre flottant, etc..., par conversion en une suite de caractères écrits dans le fichier, suivant un certain format, implicite ou explicite.

Certains langages de programmation, comme le FORTRAN, présentent le fichier séquentiel comme une collection d'enregistrements logiques correspondant à une ligne de texte. En lecture, on peut alors lire l'enregistrement complet, par le biais d'un format, et d'un ensemble de variables élémentaires. Le format est alors utilisé pour découper l'enregistrement en chaînes de caractères et les convertir dans la représentation interne de ces variables. De même, en écriture, on peut écrire un enregistrement complet, par le biais d'un format et d'un ensemble de valeurs élémentaires. Le format permet de convertir ces valeurs en leur

représentation externe et de les placer dans l'enregistrement.

2.4. Le fichier à accès aléatoire

Le but du fichier aléatoire est de permettre l'accès à un enregistrement quelconque de la collection sans avoir à parcourir tous ceux qui ont été écrits avant lui. En général, il n'y a pas de restriction du type lecture seule ou écriture seule, comme dans les fichiers séquentiels, mais au contraire définition de trois opérations principales: lecture, écriture et mise à jour d'un enregistrement après sa lecture.

Pour fournir l'accès à l'un quelconque des enregistrements, il faut que le programmeur puisse le désigner. Cette désignation peut se faire par un numéro. Dans ce cas, le fichier est vu comme une collection d'enregistrements numérotés. Pour permettre d'implanter efficacement l'accès à un enregistrement de numéro donné, la taille d'un enregistrement, c'est-à-dire, le

nombre d'octets de sa représentation, est en général fixe. Pour le programmeur, le fichier à accès aléatoire par numéro peut s'assimiler à un tableau à une dimension. C'est évidemment lui qui fixe l'attribution des numéros aux enregistrements lors des écritures.

La désignation d'un enregistrement peut se faire par l'intermédiaire d'une clé qui est en général incluse dans l'enregistrement. Lors d'une lecture, le programmeur peut, par exemple, donner d'abord une valeur aux champs correspondant à la clé dans la zone mémoire interne de l'enregistrement, et en demander la lecture. L'opération du fichier recherchera l'enregistrement correspondant et en rangera la valeur dans la zone. L'opération de mise à jour ou update, ultérieure réécrira cet enregistrement sans avoir besoin de le rechercher de nouveau. Une opération d'écriture, avec en paramètre le contenu de l'enregistrement dans une zone en mémoire interne, consistera à placer l'enregistrement dans l'objet externe, et à mettre à jour la structure de données qui permet de le retrouver (fichier séquentiel indexé ou B-arbre).

On trouve parfois un troisième type de fichier à accès aléatoire construit sur un fichier séquentiel, mais qui ne doit pas être confondu avec ce dernier. On dispose dans ce cas des deux opérations de lecture séquentielle et d'écriture séquentielle (au bout), ainsi que de deux opérations supplémentaires permettant l'accès aléatoire aux enregistrements du fichier:

noter est une fonction qui retourne une valeur binaire représentant la position de

l'enregistrement courant dans le fichier. Elle n'a de sens que pour le fichier.

positionner avec en paramètre une valeur binaire précédemment obtenue par l'opération noter ci-dessus, repositionne le fichier sur l'enregistrement sur lequel il était au moment de

cette opération.

L'utilisation de ces opérations permet au programmeur de construire des structures de données quelconques sur un fichier. La valeur retournée par noter peut s'assimiler à un pointeur

externe et n'a de sens que sur le fichier dont il provient. 68

3. La liaison entre le fichier et l'objet externe