Vous êtes sur la page 1sur 4

Cours d'algorithmique : les fichiers squentiels

Jusqu prsent, les informations utilises dans nos programmes ne pouvaient provenir que de deux sources : soit elles taient inclues dans lalgorithme lui -mme, par le programmeur, soit elles taient entres en cours de route par lutilisateur. Mais videmment, cela ne suffit pas aux besoins rels. Imaginons que lon veuille crire un programme grant un carnet dadresses. Dune excution lautre, lutilisateur doit pouvoir retrouver son carnet jour, avec les modifications quil y a apportes la dernire fois quil a excut le programme. Les donnes du carnet dadresse ne peuvent donc tre inclues dans lalgorithme, et encore moins tre entres au clavier chaque nouvelle excution ! Les fichiers sont l pour combler ce manque. Ils servent stocker des informations de manire permanente, entre deux excutions dun programme. Car si les variables, qui sont je le rappelle des adresses de mmoire vive, disparaissent chaque fin dexcution, les fich iers, eux sont stocks sur des priphriques mmoire de masse (disquette, disque dur, CD Rom).

1. Organisation des fichiers texte


Il existe deux grandes variantes pour structurer les donnes au sein dun fichier texte : la dlimitation, ou les champs de largeur fixe. Reprenons le cas du carnet dadresse ; Nous nous limiterons aux renseignements suivants : Nom, prnom, tlphone, e-mail. Les donnes, sur le fichier texte, peuvent tre organises ainsi : Structure n1 "Fonfec";"Sophie";0142156487;"fonfec@yahoo.fr" "Ztofrais";"Mlanie";0456912347 ;"ztofrais@free.fr" "Herbien";"Jean-Philippe";0289765194;"vantard@free.fr" "Hergbel";"Octave";0149875231;"rg@aol.fr" ou ainsi : Structure n2 Fonfec Herbien Sophie 0142156487fonfec@yahoo.fr 0456912347ztofrais@free.fr 0149875231rg@aol.fr

Ztofrais Mlanie Hergbel Octave

Jean-Philippe 0289765194vantard@free.fr

La structure n1 est dite dlimite ; Elle utilise un caractre de dlimitation, qui permet de reprer quand commence un champ et quand commence le suivant. Il va de soi que ce caractre de dlimitation doit tre strictement interdit lintrieur de chaque champ, faute de quoi la structure devient proprement illisible. La structure n2, elle, est dite champs de largeur fixe. Il ny a pas de caractre de dlimitation, mais on sait que les x premiers caractres de chaque ligne stockent le nom, les y suivants le prnom, etc. Cela impose bien entendu de ne pas saisir un renseignement plus long que le champ prvu pour laccueillir.

Lavantage de la structure n1 est son faible encombrement en place mmoire ; il ny a aucun espace perdu, et un fichier texte cod de cette manire occupe le minimum de place possible. Mais elle possde en revanche un inconvnient majeur, qui est la lenteur de la lecture. En effet, chaque fois que lon rcupre une ligne dans le fichier, il faut alors parcourir un par un tous les caractres pour reprer chaque occurrence du caractres de sparation avant de pouvoir dcouper cette ligne en diffrents champs. La structure n2, linverse, gaspille de la place mmoire, puisque le fichier est un vrai gruyre plein de trous. Mais dun autre ct, la rcupration des diffrents champs est trs rapide. Lorsquon rcupre une ligne, il suffit de la dcouper en diffrentes chanes de longueur prdfinie, et le tour est jou.

A lpoque o la place mmoire cotait cher, la structure dlimite tait privilgie. Mais depuis bien des annes, la quasi-totalit des logiciels et des programmeurs optent pour la structure en champs de largeur fixe. Aussi, sauf mention contraire, nous ne travaillerons quavec des fichiers btis sur cette structure.

2. Types daccs
On vient de voir que lorganisation des donnes au sein du fichier pouvait seffecteur selon deux grands choix stratgiques. Mais il existe une autre ligne de partage des fichiers : le type daccs, autrement dit la manire dont la machine va pouvoir aller rechercher les enregistrements. On distingue :

Laccs squentiel : on ne peut accder qu lenregistrement suivant celui quon vient de lire. Laccs direct (ou alatoire) : on peut accder directement lenregistrement de son choix, en prcisant le numro de cet enregistrement.

A la diffrence de la prcdente, cette typologie ne se reflte pas dans la structure elle-mme du fichier. En fait, tout fichier, quelle que soit sa structure (dlimit ou en largeur fixe) peut tre utilis avec lun ou lautre des deux grands types daccs. Le choix du type daccs nest pas un choix qui concerne le fichier lui -mme, mais uniquement la manire dont il va tre trait par la machine. Cest donc dans le programme, et seulement dans le programme, que lon choisit le type daccs souhait. Au premier abord, il est clair que laccs direct possde tous les avantages et aucun inconvnient. Sa programmation est immensment plus simple et moins fastidieuse que celle de laccs squentiel. Mais vous vous doutez bien quil y a un mais. Le gros problme de laccs direct, cest quil nest pas gr de la mme manire selon le type de machine. Car la gestion de laccs direct suppose des lments de langage " annexes ", qui diffrent selon les ordinateurs et qui ne seront pas forcment prsents. Pour rsumer, disons que si vous crivez un programme C utilisant des accs directs des fichiers, vous ntes pas absolument certains que votre programme pourra tourner sur tous les ordinateurs. En revanche, laccs squentiel, lui, est entirement pilot par le langage lui -mme. Il est donc laborieux programmer, rustique, tout ce que vous voulez, mais il offre une scurit absolue de portabilit. Voil pourquoi la plupart des programmeurs sastreignent encore utiliser ce type daccs, et voil pourquoi cest celui -l que nous allons tudier. Et de toute manire, qui peut le plus peut le moins, et une fois que vous aurez matris la programmation de laccs squentiel, celle d laccs direct vous apparatra comme une ineffable poilade.

3. Instructions
Si lon veut travailler sur un fichier texte, la premire chose faire est de louvrir. Cela se fait en attribuant au fichier un numro de canal. On ne peut ouvrir quun seul fichier par canal, mais on dispose toujours de plusieurs canaux, dont pas de soucis. Limportant est que lorsquon ouvre un fichier, on stipule ce quon va en faire : l ire, crire ou ajouter.

Si on ouvre un fichier pour lecture, on ne pourra que rcuprer les informations quil contient, sans les modifier en aucune manire. Si on ouvre un fichier pour criture, on pourra mettre dedans toutes les informations que lon veut. Mais les informations prcdentes, si elles existent, seront intgralement crases. Si on ouvre un fichier pour ajout, on ne peut ni lire, ni modifier les infos existantes. Mais on pourra, comme vous commencez vous en douter, ajouter de nouveaux enregistrements.

Au premier abord, ces limitations peuvent sembler infernales. Mais avec un peu dhabitude, on se rend compte quen fait on peut faire tout ce quon veut avec ces fichiers squentiels. Pour ouvrir un fichier texte, on crira par exemple :

Ouvrir "Exemple.txt" sur 4 pour Lecture Ici, "Exemple.txt" est le nom du fichier sur le disque dur, 4 est le numro de canal, et ce fichier a donc t ouvert en lecture, Christine, jcrois qucest clair. Ouvrir "Exemple.txt" sur 4 en Lecture Variables Truc, Nom, Prnom, Tel, Mail en Caractres Lire 4, Truc Nom Mid(Truc, 1, 20) Prnom Mid(Truc, 21, 15) Tel Mid(Truc, 36, 10) Mail Mid(Truc, 46, 20) Linstruction Lire rcupre donc dans la variable spcifie lenregistrement suivant dans un fichier. Suivant par rapport quoi ? Par rapport au dernier enregistrement lu. Cest en cela que le fichier est dit squentiel. Lire un fichier squentiel de bout en bout suppose donc de programmer une boucle. Comme on sait rarement combien denregistrements comporte le fichier, la combine consiste utiliser la fonction EOF (acronyme pour End Of File). Cette fonction est vraie si on a atteint la fin du fichier (auquel cas une lecture supplmentaire dclencherait une erreur. Lalgorithme ultra classique en pareil cas est donc : Variable Truc en Caractre Ouvrir "Exemple.txt" sur 5 en Lecture Tantque Non EOF(5) Lire 5, Truc ... FinTantQue Pour une opration dcriture, ou dajout, il faut dabord constituer une chane quivalente la nouvelle ligne du fichier. Cette chane doit donc tre " calibre " de la bonne manire, avec les diffrents champs qui " tombent " aux emplacements corrects. Le moyen le plus simple pour spargner de longs traitements est de procder avec des chanes correctement dimensionnes ds leur dclaration (la plupart des langages offrent cette possibilit) : Ouvrir "Exemple.txt" sur 3 en Ajout Variable Truc en Caractre Variables Nom*20, Prnom*15, Tel*10, Mail*15 en Caractre Nom "Joker" Prnom "Midnight" Tel "0348946532" Mail "allstars@rockandroll.com" Truc Nom & Prnom & Tel & Mail Ecrire 3, Truc Et pour finir, une fois quon en a termin avec un fichier, il ne faut pas oublier de fermer ce fichier. On libre ainsi le canal quil occupait (et accessoirement, on pourra utiliser ce canal dans la suite du programme pour un autre fichier ou pour le mme).

4. Stratgies de traitement
Il existe globalement deux manires de traiter les fichiers textes :

lune consiste sen tenir au fichier proprement dit. Cest parfois un peu acrobatique, lorsquon veut supprimer un lment dun fichier : on programme alors une boucle avec un test, qui recopie dans un deuxime fichier tous les lments du premier sauf un ; et il faut ensuite recopier intgralement le deuxime dans le premier Ouf.

lautre consiste passer par un ou plusieurs tableaux. On recopie lintgralit du fichier de dpart dans un tableau (en mmoire vive) et on ne manipule ensuite que ce tableau, quon recopie la fin dans le fichier dorigine.

Les avantages de la seconde technique sont nombreux :

la rapidit : les accs en mmoire vive sont des milliers de fois plus rapides (nanosecondes) que les accs aux mmoires de masse (millisecondes au mieux pour un disque dur) la facilit de programmation : ; bien quil faille crire en plus les instructions de recopie du fichier dans le tableau, pour peu quon doive tripoter ces informations dans tous les sens, cest largement plus facile de faire cela avec un tableau quavec des fichiers.

Pourquoi, alors, demanderez-vous haletants, ne fait-on pas cela tous les coups ? Y a-t-il des cas o il vaut mieux en rester aux fichiers et ne pas passer par des tableaux ?

la recopie dun gros fichier en mmoire vive consomme des ressources qui peuvent atteindre des dimensions considrables. Et au final, le gain de rapidit dexcution risque de ne pas tre vident. si le fichier contient des donnes de type non homognes (chanes, numriques, etc.) cela risque dtre coton pour le stocker dans un tableau : il va falloir dclarer plusieurs tableaux, dont le maniement au final peut tre aussi lourd que celui des fichiers de dpart. Ou alors, il faut utiliser une ruse quoffrent certains langages (mais pas tous) : crer des types de variables personnaliss, composs dun " collage " de plusieurs types existants (10 caractres, puis un numrique, puis 15 caractres, etc.) Cette technique est un peu acrobatique. Bien quelle ne soit pas vraiment difficile, elle exige tout de mme une certaine aisance.

Je rappelle qu priori, les fichiers textes ne sont pas l pour servir de bases de donnes (en tout cas dans des langages de programmation rcents). Donc, on aura peu de chances (ou de risques) de se trouver devant des immenses fichiers textes, ne pouvant pas tre mis en tableau. Mais ce nest pas une rgle : il faut donc bien comprendre les tenants et les aboutissants de chaque stratgie. Et pour cela, quoi de mieux que la pratique ?