Vous êtes sur la page 1sur 8

S.

Laporte

LMS

LES FICHIERS
I. O rga nisat ion de s fic hie rs
Il est difficile de trouver une notation algorithmique pour les fichiers. En effet, les fichiers reprsentent un concept de programmation trs htrogne, multiforme. Il y a des catgories, et dans les catgories, des sortes, et dans les sortes des espces. Un premier grand critre, qui diffrencie les deux grandes catgories de fichiers, est le suivant : le fichier est-il ou non organis sous forme de lignes successives ? Si oui, cela signifie vraisemblablement que ce fichier contient le mme genre d'information chaque ligne. Ces lignes sont alors appeles des enregistrements . Le fichier est donc structur . Prenons le cas classique, celui d'un carnet d'adresses. Le fichier est destin mmoriser les coordonnes d'un certain nombre de personnes. Pour chacune, il faudra noter le nom, le prnom, le numro de tlphone et l'email. Dans ce cas, il peut paratre plus simple de stocker une personne par ligne du fichier (par enregistrement). Dit autrement, quand on prendra une ligne, on sera sr qu'elle contient les informations concernant une personne, et uniquement cela. Un fichier ainsi cod sous forme d'enregistrements est appel un fichier texte. En fait, entre chaque enregistrement, sont stocks les octets correspondants aux caractres CR (code Ascii 13) et LF (code Ascii 10), signifiant un retour au dbut de la ligne suivante. Le plus souvent, le langage de programmation, ds lors qu'il s'agit d'un fichier texte, grera lui-mme la lecture et l'criture de ces deux caractres chaque fin de ligne : c'est autant de moins dont le programmeur aura s'occuper. Le programmeur, lui, n'aura qu' dire la machine de lire une ligne, ou d'en crire une. Ce type de fichier est couramment utilis ds lors que l'on doit stocker des informations pouvant tre assimiles une base de donnes (donnes structures). Le second type de fichier se dfinit a contrario : il rassemble les fichiers qui ne possdent pas de structure de lignes (d'enregistrement). Les octets, quels qu'il soient, sont crits la queue leu leu. Ces fichiers sont appels des fichiers binaires. Naturellement, leur structure diffrente implique un traitement diffrent par le programmeur. Tous les fichiers qui mmorisent pas de donnes structures sont obligatoirement des fichiers binaires : cela concerne par exemple un fichier son, une image, un programme excutable, etc. . Toutefois, on en dira quelques mots un peu plus loin, il est toujours possible d'opter pour une structure binaire mme dans le cas o le fichier reprsente des donnes structures. Autre diffrence majeure entre fichiers texte et fichiers binaires : dans un fichier texte, toutes les donnes sont crites sous forme de texte (caractres ascii). Cela veut dire que les nombres y sont reprsents sous forme de suite de chiffres (des chanes de caractres). Ces nombres doivent donc tre convertis en chanes lors de l'criture dans le fichier. Inversement, lors de la lecture du fichier, on devra convertir ces chanes en nombre si l'on veut pouvoir les utiliser dans des calculs. En revanche, dans les fichiers binaires, les donnes sont crites l'image exacte de leur codage en mmoire vive, ce qui pargne toutes ces oprations de conversion. Ceci a comme autre implication qu'un fichier texte est lisible , alors qu'un fichier binaire ne l'est pas (sauf bien sr en crivant soi-mme un programme appropri). Si l'on ouvre un fichier texte via un diteur de textes, comme le bloc-notes de Windows, on y reconnatra toutes les informations (ce sont des caractres, stocks comme tels). La mme chose avec un fichier binaire ne nous produit l'cran qu'une suite de caractres incomprhensibles.

S. Laporte

LMS

II. St ruc t ure de s e nre gist re me nts


Certains fichiers peuvent tre structurs en enregistrements. Il faut alors savoir comment sont leur tour structurs ces enregistrements. Or, l aussi, il y a deux grandes possibilits. Ces deux grandes variantes pour structurer les donnes au sein dun fichier texte sont la dlimitation et les champs de largeur fixe . Reprenons le cas du carnet dadresses, avec dedans le nom, le prnom, le tlphone et l'email. 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 Ztofrais Herbien Hergbel Sophie Mlanie Jean-Philippe Octave 0142156487fonfec@yahoo.fr 0456912347ztofrais@free.fr 0289765194vantard@free.fr 0149875231rg@aol.fr

La structure n1 est dite dlimite ; Elle utilise un caractre spcial, appel caractre de dlimitation, qui permet de reprer quand finit un champ et quand commence le suivant. 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 caractre 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 souvent 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. Remarque : lorsqu'on choisit d'utiliser des champs de largeur fixe, on peut alors trs bien opter pour un fichier binaire. Les enregistrements y seront certes la queue leu leu, sans que rien ne nous signale la jointure entre chaque enregistrement. Mais si on sait combien d'octets mesure invariablement chaque champ, on sait du coup combien d'octets mesure chaque enregistrement. Et on peut donc trs facilement rcuprer les informations : si je sais que dans mon carnet d'adresse, chaque individu occupe mettons 75 octets, alors dans mon fichier binaire, je dduis que l'individu n1 occupe les octets 1 75, l'individu n2 les octets 76 150, l'individu n3 les octets 151 225, etc.
2

S. Laporte

LMS

Type s dac c s
On vient de voir que lorganisation des donnes au sein des enregistrements 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 informations contenues dans le fichier. On distingue : Laccs squentiel : on ne peut accder qu la donne suivant celle quon vient de lire. On ne peut donc accder une information qu'en ayant au pralable examin celle qui la prcde. Dans le cas d'un fichier texte, cela signifie qu'on lit le fichier ligne par ligne (enregistrement par enregistrement). Laccs direct (ou al atoire ) : on peut accder directement lenregistrement de son choix, en prcisant le numro de cet enregistrement. Mais cela veut souvent dire une gestion fastidieuse des dplacements dans le fichier.

Laccs index : pour simplifier, il combine la rapidit de l'accs direct et la simplicit de l'accs squentiel (en restant toutefois plus compliqu). Il est particulirement adapt au traitement des gros fichiers. A la diffrence de la prcdente, cette typologie ne se reflte pas dans la structure elle-mme du fichier. En fait, tout fichier peut tre utilis avec lun ou lautre des trois 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. Pour conclure sur tout cela, voici un petit tableau rcapitulatif : Fichiers Texte On les utilise pour stocker... Ils sont structurs sous forme de... Les donnes y sont crites... Les enregistrements sont eux-mmes structurs... Lisibilit De donnes structures lignes (enregistrements) Fichiers Binaires tout, y compris des donnes structures Ils n'ont pas de structure apparente. Ce sont des octets crits la suite les uns des autres. comme en mmoire vive en champs de largeur fixe, s'il s'agit d'un fichier codant des enregistrements Le fichier a l'apparence d'une suite d'octets illisibles On peut lire les octets de son choix (y compris la totalit du fichier d'un coup)

exclusivement en tant que caractres au choix, avec un sparateur ou en champs de largeur fixe Le fichier est lisible clairement avec n'importe quel diteur de texte On ne peut lire le fichier que ligne par ligne

Lecture du fichier

Dans le cadre de ce cours, on se limitera volontairement au type de base : le fichier texte en accs squentiel. Pour des informations plus compltes sur la gestion des fichiers binaires et des autres types d'accs, il vous faudra tudier la documentation du langage spcifique dans lequel vous voulez coder.

S. Laporte

LMS

III. Inst ruc t io ns (f ic hie rs te xte e n ac c s s que nt ie l)


Si lon veut travailler sur un fichier, la premire chose faire est de louvrir. En VB, cela se fait en attribuant au fichier un numro de canal (ou un nom logique dans d'autres langages). On ne peut ouvrir quun seul fichier par canal, mais quel que soit le langage, on dispose toujours de plusieurs canaux, donc pas de soucis. Limportant est que lorsquon ouvre un fichier, on stipule ce quon va en faire : lire, crire ou ajouter. C'est le mode d'ouverture . Si on ouvre un fichier en lecture , on pourra uniquement rcuprer les informations quil contient, sans les modifier en aucune manire. Si on ouvre un fichier en criture , on pourra mettre dedans toutes les informations que lon veut. Mais les informations prcdentes, si elles existent, seront intgralement crases. Et on ne pourra pas accder aux informations qui existaient prcdemment. Si on ouvre un fichier en ajout, on ne peut ni lire, ni modifier les informations existantes. Mais on pourra ajouter de nouvelles lignes (je rappelle qu'au terme de lignes, on prfrera celui d' enregistrements). Ces limitations sont trs fortes. Il n'y a mme pas d'instructions qui permettent de supprimer un enregistrement d'un fichier ! Toutefois, avec un peu dhabitude, on se rend compte que malgr tout, mme si c'est fastidieux, on peut quand mme faire tout ce quon veut avec ces fichiers squentiels. Pour ouvrir un fichier texte, on crira par exemple :
// syntaxe VB : dclaration inutile Ouvrir Exemple.txt sur 4 en 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.
// syntaxe C Var monfichier : fichier squentiel Ouvrir "Exemple.txt" dans "monfichier" en Lecture

On utilise plutt cette notation en algo (au BTS). Monfichier est le nom logique du fichier dans le programme et Exemple.txt est le nom "physique" utilis par le systme d'exploitation. Manipulation du fichier
Var Truc: chaine Nom, Mail : chaines de 20 caractres Tel : chaine de 10 caractres Prnom : chaine de 15 caractres //syntaxe VB ... LireFichier 4, Truc Nom ? Mid(Truc, 1, 20) Prnom ? Mid(Truc, 21, 15) Tel ? Mid(Truc, 36, 10) Mail ? Mid(Truc, 46, 20) //syntaxe algo/C Lire (monfichier, Truc) Nom ? sschaine(Truc, 1, 20) Prnom ? sschaine(Truc, 1, 15) Tel ? sschaine(Truc, 1, 10) Mail ? sschaine(Truc, 1, 20)

Linstruction LireFichier (ou plus simlement Lire) rcupre donc dans la variable spcifie lenregistrement suivant dans le fichier ("suivant" est compris par rapport au dernier enregistrement

S. Laporte

LMS

lu). Cest en cela que le fichier est dit squentiel. En loccurrence, on rcupre donc la premire ligne, donc, le premier enregistrement du fichier, dans la variable Truc. Ensuite, le fichier tant organis sous forme de champs de largeur fixe, il suffit de trononner cette variable Truc en autant de morceaux quil y a de champs dans lenregistrement, et denvoyer ces tronons dans diffrentes variables. (C'est l'extraction de sous-chaines). Lire un fichier squentiel de bout en bout suppose de programmer une boucle. Comme on sait rarement lavance combien denregistrements comporte le fichier, l'astuce consiste neuf fois sur dix utiliser la fonction EOF (acronyme pour End Of File). Cette fonction renvoie la valeur Vrai 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 : chaine Ouvrir Exemple.txt sur 5 en Lecture Tantque Non EOF(5) // ou Tantque Non EOF(monfichier) LireFichier 5, Truc FinTantQue

Et neuf fois sur dix galement, si lon veut stocker au fur et mesure en mmoire vive les informations lues dans le fichier, on a recours des tableaux. Et comme on ne savait pas davance combien il y aurait denregistrements dans le fichier, on ne sait pas davantage combien il doit y avoir demplacements dans les tableaux. Quimporte, les programmeurs avertis que vous tes connaissent la combine des tableaux dynamiques. En rassemblant lensemble des connaissances acquises, nous pouvons donc crire le prototype de lecture intgrale dun fichier squentiel, lecture qui recopie lensemble des informations en mmoire vive :
Var Nom, Prnom, Tel, Mail : Tableaux[1..100] de Chaines Ouvrir Exemple.txt sur 5 en Lecture i ? -1 Tantque Non EOF(5) LireFichier 5, Truc i ? i + 1 Nom[i] ? Mid(Truc, 1, 20) Prnom[i] ? Mid(Truc, 21, 15) Tel[i] ? Mid(Truc, 36, 10) Mail[i] ? Mid(Truc, 46, 20) FinTantQue Ouvrir Exemple.txt dans "monfichier" en Lecture

Tantque Non EOF(monfichier) LireFichier 5, Truc i ? i + 1 Nom ? sschaine(Truc, 1, 20) Prnom FinTantQue

Ici, on a fait le choix de recopier le fichier dans quatre tableaux distincts. Comme on va le voir bientt, il y a encore mieux, mais ne nous impatientons pas, chaque chose en son temps. 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 Var Truc : chaine Nom, Mail : chaines de 20 caractres Prnom : chaine de 15 caractres Tel chaine de 10 caractres

Une telle dclaration assure que quel que soit le contenu de la variable Nom, par exemple, celle -ci comptera toujours 20 caractres. Si son contenu est plus petit, alors un nombre correct despaces sera
5

S. Laporte

LMS

automatiquement ajout pour combler. Si on tente dy entrer un contenu trop long, celui-ci sera automatiquement tronqu.

Nom ? Jokers Prnom ? Midnight Tel ? 0348946532 Mail ? allstars@rockandroll.com Truc ? Nom & Prnom & Tel & Mail EcrireFichier 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).

IV. St rat gie s de t ra ite me nt


Il existe globalement deux manires de traiter les fichiers textes : lune consiste sen tenir au fichier proprement dit, c'est--dire modifier directement les informations sur le disque dur. 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 fichier sauf un ; et il faut ensuite recopier intgralement le deuxime fichier la place du premier fichier lautre stratgie consiste, comme on la vu, passer par un ou plusieurs tableaux. En fait, le principe fondamental de cette approche est de commencer, avant toute autre chose, par recopier lintgralit du fichier de dpart en mmoire vive. Ensuite, on ne manipule que le(s) tableau(x) en mmoire vive. Et lorsque le traitement est termin, on recopie nouveau dans l'autre sens, depuis la mmoire vers le fichier dorigine. Les avantages de la seconde technique sont nombreux, et 99 fois sur 100, c'est ainsi qu'il faudra procder : 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). En basculant le fichier du dpart dans un tableau, on minimise le nombre ultrieur d'accs disque, tous les traitements tant ensuite effectus en mmoire. la facilit de programmation : bien quil faille crire les instructions de recopie du fichier dans le tableau, pour peu quon doive tripoter les informations dans tous les sens, cest largement plus facile de faire cela avec un tableau quavec des fichiers. Mais il vaut mieux en rester aux fichiers et ne pas passer par des tableaux quand on utilise de trs gros fichiers. En effet, la recopie dun trs gros fichier en mmoire vive exige des ressources qui peuvent atteindre des dimensions considrables. Donc, dans le cas d'immenses fichiers (trs rares, cependant, car pour les grosses bases de donnes, on utilise des SGBD), la recopie en mmoire peut s'avrer problmatique.

V. Ut ilisat ion de s do nn e s st ruc t ur e s


A. Donnes structures simples
L'utilit d'une variable structure (compose de plusieurs variables de type diffrent), lorsqu'on traite des fichiers texte (et mme, des fichiers en gnral), saute aux yeux : car on va pouvoir calquer chacune des lignes du fichier en mmoire vive, et considrer que chaque enregistrement sera recopi dans une variable et une seule, qui lui sera adapte. Ainsi, le problme du "dcoupage" de chaque enregistrement en diffrentes variables (le nom, le prnom, le numro de tlphone, etc.) sera rsolu
6

S. Laporte

LMS

d'avance, puisqu'on aura une structure, un gabarit, en quelque sorte, tout prt d'avance pour accueillir et prdcouper nos enregistrements. Attention toutefois ; lorsque nous utilisions des variables de type prdfini, comme des entie rs, des boolens, etc. nous n'avions qu'une seule opration effectuer : dclarer la variable en utilisant un des types existants. A prsent que nous voulons crer un nouveau type de variable (par assemblage de types existants), il va falloir faire deux choses : d'abord, crer le type. Ensuite seulement, dclarer la (les) variable(s) d'aprs ce type. Reprenons une fois de plus l'exemple du carnet d'adresses. Nous allons donc, avant mme la dclaration des variables, crer un type, une structure, calque sur celle de nos enregistrements, et donc prte les accueillir :
Structure Bottin Nom : chaine de 20 caractres Prnom : chaine de 15 caractres Tel chaine de 10 caractres Mail : chaine de 20 caractres Fin Structure

Ici, Bottin est le nom de ma stucture (mon type structur). Ce mot jouera par la suite dans mon programme exactement le mme rle que les types prdfinis comme Numrique, Caractre ou Boolen. Maintenant que la structure est dfinie, je vais pouvoir, dans la section du programme o s'effectuent les dclarations, crer une ou des variables correspondant cette structure :
Var Individu : Bottin

Je pourrais remplir les diffrentes informations contenues au sein de la variable Individu de la manire suivante :
Individu ?Joker,Midnight,0348946532,allstars@rock.com

Mais cette notation est viter, car peu de langages l'acceptent. Il faut manipuler les variables structures champs par champs.
Individu.Nom ? Jokers Individu.Prnom ? Midnight Individu.Tel ? 0348946532 Individu.Mail ? allstars@rockandroll.com

Ainsi, crire correctement une information dans le fichier est un jeu d'enfant, puisqu'on dispose d'une variable Individu au bon gabarit. Une fois remplis les diffrents champs de cette variable - ce qu'on vient de faire -, il n'y a plus qu' envoyer celle -ci directement dans le fichier (ici, fichier de canal 3).
EcrireFichier 3, Individu

De la mme manire, dans l'autre sens, l'opration de lecture dans le fichier Adresses sera considrablement simplifie : la structure tant faite pour cela, je peux dornavant me contenter de recopier une ligne du fichier dans une variable de type Bottin, et le tour sera jou. Pour charger l'individu suivant du fichier de canal 5 en mmoire vive, il me suffira donc d'crire :
LireFichier 5, Individu

Et l, direct, j'ai bien mes quatre renseignements accessibles dans les quatre champs de la variable individu. Tout cela, videmment, parce que la structure de ma variable Individu correspond parfaitement la structure des enregistrements de mon fichier.

S. Laporte

LMS

B. Tableaux de donnes structures


Si partir des types simples, on peut crer des variables et des tableaux de variables, vous me voyez venir, partir des types structurs, on peut crer des variables structures... et des tableaux de variables structures. Cela veut dire que nous disposons d'une manire de grer la mmoire vive qui va correspondre exactement la structure d'un fichier texte (de donnes structures). Comme les structures se correspondent parfaitement, le nombre de manipulations effectuer, autrement dit de lignes de programme crire, va tre rduit au minimum. En fait, dans notre tableau structur, les champs des emplacements du tableau correspondront aux champs du fichier texte, et les indices des emplacements du tableau correspondront aux diffrentes lignes du fichier. Voici, titre d'illustration, l'algorithme complet de lecture du fichier Adresses et de sa recopie intgrale en mmoire vive, en employant un tableau structur.
Structure Bottin Nom : chaine de 20 caractres Prnom : chaine de 15 caractres Tel chaine de 10 caractres Mail : chaine de 20 caractres Fin Structure Mespotes : Tableau(1..100) de Bottin Ouvrir Exemple.txt sur 3 en Ajout i ? 0 Tantque Non EOF(5) i ? i + 1 LireFichier 5, Mespotes(i) FinTantQue

Une fois que ceci est rgl, on a tout ce qu'il faut ! Si je voulais crire, un moment, le mail de l'individu n13 du fichier (donc le n12 du tableau) l'cran, il me suffirait de passer l'ordre :
Ecrire Mespotes(12).Mail

R c apit ulatif g n ral


Lorsqu'on est amen travailler avec des donnes situes dans un fichier, plusieurs choix, en partie indpendants les uns des autres, doivent tre faits : ? sur l'organisation en enregistrements du fichier (choix entre fichier texte ou fichier binaire) ? sur le mode d'accs aux enregistrements du fichier (direct ou squentiel) ? sur l'organisation des champs au sein des enregistrements (prsence de sparateurs ou largeur fixe) ? sur la mthode de traitement des informations (recopie intgrale du fichier en mmoire vive ou non) ? sur le type de variables utilises pour cette recopie en mmoire vive (plusieurs tableaux de type simple, ou un seul tableau de type structur). Chacune de ces options prsente avantages et inconvnients, et il est impossible de donner une rgle de conduite valable en toute circonstance. Il faut connatre ces techniques, et savoir choisir la bonne option selon le problme traiter.

Vous aimerez peut-être aussi