Algorithme:Fichiers instructions

Un article de WikiTuto.

Jump to: navigation, search

Sommaire

Explication

Instructions (Fichiers texte en accès séquentiel)
Si l’on veut travailler sur un fichier, la première chose à faire est de l’ouvrir. Cela se fait en attribuant au fichier un numéro de canal. On ne peut ouvrir qu’un seul fichier par canal, mais quel que soit le langage, on dispose toujours de plusieurs canaux, donc pas de soucis.

L’important est que lorsqu’on ouvre un fichier, on stipule ce qu’on va en faire : lire, écrire ou ajouter.

  • Si on ouvre un fichier pour lecture, on pourra uniquement récupérer les informations qu’il contient, sans les modifier en aucune manière.
  • Si on ouvre un fichier pour écriture, on pourra mettre dedans toutes les informations que l’on veut. Mais les informations précédentes, si elles existent, seront intégralement écrasées Et on ne pourra pas accéder aux informations qui existaient précédemment.
  • Si on ouvre un fichier pour ajout, on ne peut ni lire, ni modifier les informations existantes. Mais on pourra, comme vous commencez à vous en douter, ajouter de nouvelles lignes (je rappelle qu'au terme de lignes, on préférera celui d’enregistrements.

Au premier abord, ces limitations peuvent sembler infernales. Au deuxième rabord, elles le sont effectivement. Il n'y a même pas d'instructions qui permettent de supprimer un enregistrement d'un fichier !

Toutefois, avec un peu d’habitude, on se rend compte que malgré tout, même si ce n’est pas toujours marrant, on peut quand même faire tout ce qu’on veut avec ces fichiers séquentiels.

Exemple

Pour ouvrir un fichier texte, on écrira par exemple :

Ouvrir "Exemple.txt" sur 4 en Lecture

ici, "Exemple.txt" est le nom du fichier sur le disque dur, 4 est le numéro de canal, et ce fichier a donc été ouvert en lecture. Vous l’aviez sans doute pressenti. Allons plus loin :

Variables Truc, Nom, Prénom, Tel, Mail en Caractères
Début
Ouvrir "Exemple.txt" sur 4 en Lecture
LireFichier 4, Truc
Nom ← Mid(Truc, 1, 20)
Prénom ← Mid(Truc, 21, 15)
Tel ← Mid(Truc, 36, 10)
Mail ← Mid(Truc, 46, 20)

Lecture du fichier

L’instruction LireFichier récupère donc dans la variable spécifiée l’enregistrement suivant dans le fichier... "suivant", oui, mais par rapport à quoi ? Par rapport au dernier enregistrement lu. C’est en cela que le fichier est dit séquentiel. En l’occurrence, on récupère donc la première 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 tronçonner cette variable Truc en autant de morceaux qu’il y a de champs dans l’enregistrement, et d’envoyer ces tronçons dans différentes variables. Et le tour est joué

La suite du raisonnement s’impose avec une logique impitoyable : lire un fichier séquentiel de bout en bout suppose de programmer une boucle. Comme on sait rarement à l’avance combien d’enregistrements comporte le fichier, la combine 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 supplémentaire déclencherait une erreur). L’algorithme, ultra classique, en pareil cas est donc

Variable Truc en Caractère
Ouvrir "Exemple.txt" sur 5 en Lecture
Début
Tantque Non EOF(5)
  LireFichier 5, Truc
  …
FinTantQue
Fermer 5
Fin

Et neuf fois sur dix également, si l’on veut stocker au fur et à mesure en mémoire vive les informations lues dans le fichier, on a recours à un ou plusieurs tableaux. Et comme on ne sait pas d’avance combien il y aurait d’enregistrements dans le fichier, on ne sait pas davantage combien il doit y avoir d’emplacements dans les tableaux. Qu’importe, les programmeurs avertis que vous êtes connaissent la combine des tableaux dynamiques.

En rassemblant l’ensemble des connaissances acquises, nous pouvons donc écrire le prototype du code qui effectue la lecture intégrale d’un fichier séquentiel, tout en recopiant l’ensemble des informations en mémoire vive :

Tableaux Nom(), Prénom(), Tel(), Mail() en Caractère
Début
Ouvrir "Exemple.txt" sur 5 en Lecture
i ← -1
Tantque Non EOF(5)
  LireFichier 5, Truc
  i ← i + 1
  Redim Nom(i+1)
  Redim Prénom(i+1)
  Redim Tel(i+1)
  Redim Mail(i+1)
  Nom(i) ← Mid(Truc, 1, 20)
  Prénom(i) ← Mid(Truc, 21, 15)
  Tel(i) ← Mid(Truc, 36, 10)
  Mail(i) ← Mid(Truc, 46, 20)
FinTantQue
Fermer 5
Fin

Ici, on a fait le choix de recopier le fichier dans quatre tableaux distincts. On aurait pu également tout recopier dans un seul tableau : chaque case du tableau aurait alors été occupée par une ligne complète (un enregistrement) du fichier. Cette solution nous aurait fait gagner du temps au départ, mais elle alourdit ensuite le code, puisque chaque fois que l'on a besoin d'une information au sein d'une case du tableau, il faudra aller procéder à une extraction via la fonction MID. Ce qu'on gagne par un bout, on le perd donc par l'autre.

Mais surtout, comme on va le voir bientôt, il y a autre possibilité, bien meilleure, qui cumule les avantages sans avoir aucun des inconvénients.

Néanmoins, ne nous impatientons pas, chaque chose en son temps, et revenons pour le moment à la solution que nous avons employée ci-dessus.

Pour une opération d’écriture, ou d’ajout, il faut d’abord impérativement, sous peine de semer la panique dans la structure du fichier, constituer une chaîne équivalente à la nouvelle ligne du fichier. Cette chaîne doit donc être « calibrée » de la bonne manière, avec les différents champs qui « tombent » aux emplacements corrects. Le moyen le plus simple pour s’épargner de longs traitements est de procéder avec des chaînes correctement dimensionnées dès leur déclaration (la plupart des langages offrent cette possibilité) :

Ouvrir "Exemple.txt" sur 3 en Ajout
Variable Truc en Caractère
Variables Nom*20, Prénom*15, Tel*10, Mail*20 en Caractère

Une telle déclaration assure que quel que soit le contenu de la variable Nom, par exemple, celle-ci comptera toujours 20 caractères. Si son contenu est plus petit, alors un nombre correct d’espaces sera automatiquement ajouté pour combler. Si on tente d’y entrer un contenu trop long, celui-ci sera automatiquement tronqué. Voyons la suite :

Nom ← "Jokers"
Prénom ← "Midnight"
Tel ← "0348946532"
Mail ← "allstars@rockandroll.com"
Truc ← Nom & Prénom & Tel & Mail
EcrireFichier 3, Truc

Et pour finir, une fois qu’on en a terminé avec un fichier, il ne faut pas oublier de fermer ce fichier. On libère ainsi le canal qu’il occupait (et accessoirement, on pourra utiliser ce canal dans la suite du programme pour un autre fichier… ou pour le même).

Exercices

Voir aussi

Boîte à outils
Annuaire gratuitCe site est listé dans la catégorie Informatique : Aide et astuces en informatique Annuaire