| Une remarque pertinente ? Une critique impertinente ? Un lynchage en règle ? Une invitation sous les tropiques ?  Ecrivez-moi ! |  | 
| Conçu et enseigné tel qu'en lui même, avec pertes, fracas et 
   humour de qualité supérieure              par Christophe Darmangeat dans le M2 PISE du Master MECI (Université Paris 7) | |
|  | |
|   | Partie 14 Les fichiers texte 
      Comme nous l'avons vu lors d'un excellentissime 
      cours 
      d'algorithmique, malgré les progrès et la sophistication croissante 
      des langages de programmation, le fichier texte reste la voie la 
      plus rustique - mais aussi une des plus sûres - pour stocker des données entre deux 
      exécutions d'un programme. Aussi allons-nous traiter de l'accès aux fichiers, en 
      nous cantonnant à la technique de base : le fichier texte en accès 
      séquentiel. C'est ce qu'on appelle un chapitre - relativement - reposant. 
       1. Les instructions liées aux fichiers texte Bon, là, quand on connaît la musique - c'est-à-dire le concept du 
      fichier texte - il n'y a plus qu'à 
      apprendre la syntaxe. Le plus difficile, c'est d'arriver à choisir, 
      parmi la pelletée d'instructions que propose VB pour traiter des 
      fichiers texte (et ça ne manque pas, ils sont vraiment fous !) une 
      bonne petite technique qui soit simple et qui marche bien. Bande de 
      petits veinards, ce boulot, c'est moi qui me le suis cogné, et voilà 
      le résultat de mes savantes recherches. Pour ouvrir un fichier texte, le plus facile est de passer par 
      l'instruction FileOpen, selon la syntaxe suivante : FileOpen(numéro, nom du fichier, mode) 
 Ensuite, pour recopier la ligne suivante du ficher numéro 3 dans 
      la variable Toto, on écrira : Toto = LineInput(3) De même, pour recopier la variable Tutu en tant que ligne dans le 
      fichier numéro 5, on écrira : PrintLine(5, Toto) La fonction retournant une valeur booléenne indiquant si l'on se 
      trouve à la fin du fichier est évidemment EOF(), avec le numéro 
      dudit fichier en paramètre. Enfin, pour fermer le fichier numéro 1, 
      on emploiera : FileClose(1) Voilà. On ne peut pas dire que tout cela fasse bien mal à la 
      tête. 
       2. Récupérer les lignes dans des variables 
       C'est là qu'on commence à rire pour de bon. 
       En effet, jusque là, dans tout langage civilisé, une des 
       stratégies qui fonctionnait en toutes circonstances, pour le 
       traitement des fichiers texte comme pour celui des fichiers 
       binaires, consistait à travailler avec des structures. Ces 
       structures étaient définies de manière à "coller" avec la manière 
       dont les données étaient rangées dans les fichiers. 
       En ce qui concerne les fichiers texte, cela revenait à organiser 
       les données - dans le fichier - sous la forme de champs de largeur 
       fixe. Et à employer, en mémoire vive, une structure elle aussi "de 
       largeur fixe", composée de chaînes de caractères au nombre de 
       caractères déterminés une bonne fois pour toutes. Tout n'était 
       peut-être pas pour le mieux dans le meilleur des mondes possibles, 
       mais disons qu'on s'en approchait tranquillement. Eh bien, la 
       nouvelle neuve du jour, c'est qu'avec VB.Net, il n'existe plus de 
       chaînes de largeur fixe. Adieu donc les structures telles que nous 
       les avons connues, et adieu les fichiers texte organisés sous 
       forme de champs de largeur fixe. C'est beau, le progrès, non ? 
       Alors, à défaut de pouvoir faire ce qu'on veut, on n'a plus qu'à 
       se résoudre à faire ce qu'on peut. C'est-à-dire à se rabattre sur 
       les fichiers texte organisés sous forme de champs délimités.  Petit rappel : Cela signifie que sur chaque ligne (enregistrement) de notre fichier, les différentes informations (les différents champs) seront séparés par un caractère séparateur (on le choisit généralement parmi la tabulation, la virgule, le point-virgule, et quelques autres). Il va donc falloir, à chaque lecture de ligne 
       du fichier, procéder à un découpage de cette ligne entre les 
       différentes variables qui la composent. Mais comme nous avons de 
       la chance dans notre malheur, nous allons pouvoir nous dispenser 
       de nous taper une boucle lisant cette ligne caractère par 
       caractère, afin d'y localiser les occurrences du caractère 
       séparateur (chose qui était inéluctable dans les langages 
       traditionnels). VB .Net propose en effet deux fonctions de 
       découpage et de recomposition automatique des chaînes, qui vont 
       grandement soulager notre peine. Voyons donc : La fonction Split permet de constituer automatiquement un 
       tableau de Strings à partir d'une chaîne de caractères dans 
       laquelle figure un caractère de séparation. Ainsi, en exécutant le 
       code suivant : Dim S As String Dim R() As String S ="Ceci/est/un/message/codé" R = Split(S, "/") On récupère un tableau R de cinq cases, la première contenant 
       "Ceci", la seconde "est", la troisième "un", etc. Et VB.Net 
       autorisant des écritures beaucoup plus synthétiques, nous pouvons 
       réécrire le code ci-dessus en deux coups de cuiller à pot : Dim S As String = "Ceci/est/un/message/codé" Dim R() As String = Split(S, "/") Éventuellement, rien ne nous empêche ensuite de rebasculer les 
       différents éléments de R dans une structure, ou dans un tableau de 
       structures, si nous trouvons cela plus pratique (et il y a neuf 
       chances sur dix pour que cela le soit effectivement). Simplement, 
       je réinsiste, il ne s'agira pas de structures comportant des 
       chaînes de longueur fixe. Dans l'autre sens, nous trouvons en quelque sorte l'exact 
       inverse de la fonction Split, en la personne de la fonction Join, 
       puisque celle-ci constitue une chaîne unique à partir d'un tableau 
       de Strings et d'un séparateur. Ainsi, si je repars du tableau R 
       constitué un peu plus haut et que j'écris : Dim Z As String Z = Join(R, ";") Z contiendra "Ceci;est;un;message;codé". 
        Magique, non ? Évidemment, on aurait même pu se contenter de : 
        Dim Z As String = Join(R, ";") Résumons-nous : 
 On peut donc dégager le processus-type pour le traitement d'un 
       fichier texte sous VB.Net (sachant que ce fichier devra être 
       organisé via un caractère séparateur) : 
 Et voilà. Ensuite, on procède à tous les traitements 
       nécessaires (en mémoire vive, comme il se doit). Lorsque c'est 
       terminé, on recopie le tableau de structures vers le fichier : 
 Vous auriez préféré que j'écrive le code ? Ben 
        voyons... Il faut tout de même que je vous laisse quelques 
        occasions de vous dérouiller les neurones. L'exercice qui suit, sans être vraiment 
         méchant, n'est pas particulièrement facile. Il demande de 
         gérer un fichier texte - vous le trouverez ci-dessous.  Il pose également (et surtout ?) quelques problèmes liés à la gestion d'une seconde Form, problèmes que nous avions évité jusque là, et dont je ne traite pas dans ce site, mais qu'il faut bien aborder un jour ou l'autre. C'est ici un cas assez facile, sur lequel vous trouverez des indications sur le site de Microsoft. Quant au score obtenu lors de ce grand jeu, il s'agit tout bêtement d'un nombre aléatoire entre 1 et 1000. |