Académique Documents
Professionnel Documents
Culture Documents
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
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
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).
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
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