| 
	   |       
             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. 
        
      
      
       |