|
Rappel : Ce cours est enseigné dans la |
On n’abordera pas ici la manière dont on peut attaquer des fichiers complexes
(comme des bases de données), via des contrôles ad hoc. Ce point a été
délibérément zappé du cours, pour des questions de temps et de redondances
avec d’autres matières.
Ce petit chapitre a pour but plus limité, de vous fournir un outil simple et
universel pour stocker et récupérer des données d’une exécution à une
autre, au travers d’un genre de fichier qu’on a déjà dû vous présenter
amplement en C : le fichier texte à accès
séquentiel.
On peut également accéder aux fichiers en "accès direct" ; il existe aussi des
fichiers dits "binaires", mais il faut faire vite, et on se concentrera
ici sur le type le plus basique (mais pas le moins utile).
Pour plus de précisions, il n’est pas interdit de zieuter attentivement sur la
gestion de
fichiers un excellent cours
d’algorithmique que je recommande vivement à ceux qui ne le connaissent
pas..
Pour ouvrir un fichier, vous devez connaître son nom
(y compris le chemin d’accès), dire ce que vous voulez en faire (lire, écrire,
ou ajouter ?) et lui attribuer un numéro arbitraire, dit
numéro de canal. Cela donnera ainsi :
Open "C:\TextFile.txt" For Input As #1
Bien sûr, si vous utilisez plusieurs fichiers simultanément, il est impératif de
leur attribuer chacun un numéro de canal différent…
For Input signifie qu’on ouvre le fichier en lecture. Pour l’ouvrir en écriture, on
utilisera For Output, et pour l’ouvrir en ajout, For Append.
Rappel : à l'ouverture, il faut choisir, on ne peut faire qu’une seule chose à la fois avec un
fichier.
Et puis tant qu'on y est, et d'un même élan sublime, voici l'instruction de fermeture d'un fichier :
Close #i
où i est le numéro de canal du fichier à fermer.
Il y a trois possibilités. Deux que
je ne cite que pour l’anecdote, car mieux vaut les éviter, et une vraiment
utile.
Pour l’anecdote uniquement, donc :
NomDeVariable = Input (100, #i)
...recopie dans NomDeVariable les 100 caractères suivants du fichier numéro i, à partir de la dernière
lecture. Sinon, on peut aussi faire :
Toto = LOF(#i)
Input (Toto, #i)
Toto récupère ici le nombre de caractères du fichier texte, via la fonction
LOF. On recopie ensuite tout le fichier d’un seul coup
d'un seul dans la variable NomDeVariable.
Mais l'avantage des fichiers texte étant d'être organisés par lignes, c'est-à-dire par enregistrements,
voilà ce qu’il faut utiliser
afin de ne pas perdre cette structuration :
Line Input #i, NomDeVariable
C’est de loin la meilleure solution. Elle suppose toutefois que le fichier texte
soit correctement construit, c’est-à-dire que chaque série de champs se termine par
les caractères CR LF, formant ainsi une ligne (vous n’avez pas besoin de vous tracasser
pour cela, si vous avez vous-mêmes correctement créé le fichier texte). A
ce moment-là, chaque lecture avec Line Input
copie la ligne suivante du fichier dans NomDeVariable.
Si vous avez eu de surcroît la bonne idée de bâtir votre fichier sous forme de
champs de largeur fixe, ce sera un jeu d'enfants
de récupérer, au sein de chaque ligne, les différents champs. D'une
manière ou d'une autre, il suffira de découper à un moment ou à un
autre NomDeVariable
en différents morceaux via la fonction Mid
(on aura soin d’épurer les espaces inutiles grâce à la fonction
Trim mentionnée précédemment.
Je rappelle qu'avec les fichiers, la technique standard consiste à balancer d'entrée
de jeu l'intégralité du fichier en mémoire vive, autrement dit dans un
tableau (on évite de faire cela uniquement si le fichier est vraiment trop
massif pour tenir en mémoire, ce qui est un cas très rare). En revanche,
pour le détail, on peut opter pour plusieurs options : soit "casser"
d'entrée chaque ligne du fichier en différents champs qui rempliront
différents tableaux, soit tout envoyer dans un seul tableau, à raison
d'une ligne complète par élément du tableau, ligne dont on
extrait ensuite les champs au fur et à mesure des besoins. C'est au choix du client. Cette seconde
technique donnera, extrêmement classiquement, les lignes de code suivantes :
Dim T() as string
... Open "C:\Monfichier.txt" As #1 For Input i = -1 While Not Eof(1) i = i + 1 Redim Preserve T(i) Line Input #1, T(i) Wend
Le principe est simple : on crée un tableau dynamique. On parcourt le fichier ligne
après ligne tant qu'il en reste (boucle While ... Wend). A chaque ligne,
on actualise l'indice i, on redimensionne le tableau, et on recopie la
ligne dans la nouvelle case ainsi créée, tout en préservant les cases
précédemment remplies. Et hop.
Là, c'est carrément du gâteau. L'écriture se fait systématiquement ligne par ligne. L’instruction à utiliser est :
Print #i, NomDeVariable
…qui écrit donc le contenu de la variable NomDeVariable dans le fichier de numéro i.
Encore une fois, pour être certain que les différentes informations sont rangées en respectant les champs de
largeur fixe, le plus simple aura été de déclarer certaines variables
String comme possédant toujours un nombre fixe de caractères.
Par exemple, en ayant déclaré :
Dim Nom as String*25
Je le répète, j’ai créé
une variable caractère Nom qui, quoi
qu’il arrive dans la suite du code, possédera
toujours 25 caractères exactement. Je constituerai donc une
ligne du fichier (la variable caractère NomDeVariable) par concaténation
de différentes variables caractères de largeur fixe, et j’enverrai ensuite
cette ligne dans le fichier par un Print.
Ainsi, on est certain de respecter la structure du fichier et de pouvoir
réutiliser celui-ci la fois suivante.
Si l'on a choisi la meilleure solution, à savoir utiliser les variables structurées, il reste tout de même
un petit souci. C'est que si VB autorise la lecture d'une ligne dans une variable structurée, il interdit
la recopie directe d'une variable structurée dans un fichier texte. C'est énervant, mais c'est comme ça.
Cette recopie devra donc se faire sous forme de concaténation de champs, par exemple :
Print #2, T(i).Nom & T(i).Prenom & T(i).Tel
Allez, vous en savez maintenant bien assez. Roulez jeunesse :
Attention ! Pour fonctionner, ces
applications ont besoin que le(s) fichier(s) texte associé(s) aient
été téléchargés et aient été placés dans le même répertoire que
l'exécutable. A noter que l'exercice Rock'n Roll utilise deux fichiers
simultanément.
|