Rappel : Ce cours est enseigné dans la
spécialité PISE du Master MECI (Université Paris 7)
par Christophe Darmangeat

Partie 8
Gestion des fichiers
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..
1. Ouvrir et fermer un fichier
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.


2. Lire un fichier
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.


3. Ecrire dans un fichier
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.
Nom de l'exercice
Exécutable
Fichiers
Sources
Fort Knox
Rock n'Roll