Programmer en langage C
188
© Éditions Eyrolles
Or il faut savoir qu’avec beaucoup de systèmes, dès que vous écrivez le énième octet d’un
fichier, il y a automatiquement réservation de la place de tous les octets précédents ; leur
contenu, par contre, doit être considéré comme étant aléatoire. De toute façon, tous les
systèmes réservent toujours la place d’un nombre minimal d’octets, de sorte que le problème
évoqué existe toujours, au moins pour certains octets du fichier.
Dans ces conditions, vous voyez que, à partir du moment où rien n’impose à l’utilisateur de ne
pas « laisser de trous » lors de la création du fichier, il faudra être en mesure de repérer ces
trous lors d’éventuelles consultations ultérieures du fichier. Plusieurs techniques existent à cet
effet :
●
on peut, par exemple, avant d’exécuter le programme précédent, commencer par initialiser
tous les emplacements du fichier à une valeur spéciale, dont on sait qu’elle ne pourra pas
apparaître comme valeur effective ;
●
on peut aussi gérer une table des emplacements inexistants, cette table devant alors être
conservée (de préférence) dans le fichier lui-même.
D’autre part, il faut bien voir que l’accès direct n’a d’intérêt que lorsque l’on est en mesure
de fournir le rang de l’emplacement concerné. Ce n’est pas toujours possible. Ainsi, si l’on
considère ne serait-ce qu’un simple fichier de type répertoire téléphonique, on voit qu’en général on cherchera à accéder à une personne par son nom plutôt que par son numéro d’ordre dans
le fichier. Cette contrainte qui semble imposer une recherche séquentielle peut être contournée
par la création de ce que l’on nomme un index, c’est-à-dire une table de correspondance entre
un nom d’individu et sa position dans le fichier.
Nous n’en dirons pas plus sur ces méthodes spécifiques de gestion de fichiers qui sortent du
cadre de cet ouvrage.
3.3 En cas d’erreur
a) Erreur de pointage
Il faut bien voir que le positionnement dans le fichier se fait sur un octet de rang donné, et non,
comme on pourrait le préférer, sur un bloc (ou enregistrement) de rang donné. D’ailleurs,
n’oubliez pas qu’en général cette notion d’enregistrement n’est pas exprimée de manière
intrinsèque au sein du fichier. Ainsi, dans notre programme précédent, vous pourriez, par
mégarde, utiliser la formule suivante :
sizeof(int) * num -1
laquelle vous positionnerait systématiquement « à cheval » entre le dernier octet d’un entier et
le premier du suivant. Bien entendu, les résultats obtenus seraient quelque peu fantaisistes.
Cette remarque prend encore plus d’acuité lorsque vous créez un fichier à partir de structures.
Dans ce cas, nous ne saurions trop vous conseiller d’avoir systématiquement recours à l’opérateur sizeof pour déterminer la taille réelle de ces structures.
Delannoy Livre.book Page 188 Mercredi, 6. mai 2009 4:26 16
Précédent

- 201/281

Suivant