Tutorial N°3 :: Lecture / Ecriture fichiers séquentiels

19-02-2006 à 00:39:49
Tutorial n°3

Lecteur / Ecriture de fichier (Séquentiel)

Avant de lire ou d'écrire dans un fichier il faut l'ouvrir, c'est ce que nous verrons ici.

La commande permettant d'ouvrir un fichier est la commande, openelle se compose ainsi:

open chemin du fichier for mode as numéro


chemin du fichier : Il s'agit ici d'un chemin complet du fichier, vous pouvez le définir par une variable en string ou un texte entre guillemets. (ex : "c:\test.txt")
mode : il s'agit du mode de lecture/écriture que vous utiliserez :
Binary : lecture/écriture en mode binaire au niveau des octets
random : lecture/écriture du fichier en mode aléatoire, c'est à dire dans n'importe quel ordre
output : écriture du fichier en mode séquentiel du début vers la fin.
input : lecture du fichier en mode séquentiel du début vers la fin.
Numéro : ce numéro identifie le fichier ouvert, ceci vous permet d'ouvrir simultanément plusieurs fichiers. Celui-ci peut être une variable ou un numéro définit mis sous la forme #1, #2,.....

Dans ce tutorial nous aborderons que les modes input et output (lecture / écriture séquentiel)

Si le fichier demandé n'existe pas la commande open le crée automatiquement.
Tout programme contenant la commande Open doit également contenir la commande Close qui permet de fermer le fichier. Gardez à l'esprit que lorsqu'un fichier est ouvert en mode écriture aucun autre programme ne peut y accéder.
La commande close fonctionne ainsi :

Close numéro


La commande Reset permet de fermer en une seule fois l'intégralité des fichiers ouvert par l'application.
Ne pas fermer un fichier avant la fin du programme c'est pas un drame, VB les fermes automatiquement en quittant, toutefois cela devient gênant si vous tentez d'ouvrir d'autre fichier avec un numéro de fichier non fermé.
La commande FreeFile renvoi le numéro de fichier libre suivant.

Lecture séquentielle (Input)

Commençons simple, nous allons lire un fichier en mode séquentiel.
Pour commencer, il nous faut choisir un fichier, créez un fichier avec bloc-note et écrivez y plusieurs lignes, par exemple, marquez Ligne 1, puis Ligne 2....
Nous devons maintenant ouvrir ce fichier dans VB, créer une nouvelle application, placez un bouton command1 dans la feuille et mettez "Ouvrir" dans sa propriété Caption.
Placez maintenant dans l'évènement Click de ce bouton la commande d'ouverture du fichier.

open "chemin" for
input as #1


Plaçons maintenant un bouton "lire la ligne suivante" sur le form.
Pour récupérer la valeur d'une ligne dans ce mode de lecture il faut utiliser la commande :

input numéro,variable


Numéro est le numéro du fichier dans lequel nous désirons lire les données, dans notre cas, #1
variable, il s'agit du nom de la variable dans laquelle VB placera le contenu de la ligne.
Prenons la variable strLigne que vous définissez en tant que string.
Après la command input, plaçons une commande qui nous affichera la valeur de la ligne en cour. Utilisons un boite de dialogue Msgbox
Placez donc :

Msgbox (strLigne)


Ajoutez ensuite un bouton "Fermer" avec la commande Close, dans notre cas :

Close #1


Voilà, votre programme devrait être fonctionnel, allez-y, testez, si tout fonctionne, ouvrez le fichier, puis faites "lire la ligne suivante", vous verrez alors s'afficher la valeur des différentes lignes de votre fichier.
A chaque appel de la commande input, celle-ci lit la ligne qui suit la ligne lut auparavant, et ce jusqu'a la fin du fichier.
Toutefois attention, si vous dépassez la fin du fichier et que vous appelez à nouveau la commande, celle-ci provoquera une erreur, pour évitez cela, il faut vérifier que la fin du fichier n'est pas atteinte avant de le lire, pour cela VB dispose de la fonction EOF(numéro) qui renvoie TRUE si la fin du fichier est atteinte et FALSE si elle ne l'est pas.
Placez donc avant la commande input :

if eof(1)=false then input......


Voila, votre code devrait ressembler à ça :

'on définit les variables
dim strLigne as String

Private sub Command1_click()
'on ouvre le fichier
open "c:\test.txt" for input as #1
end sub

private sub command2_click()
if eof(1)=false then
'si la fin du fichier n'est pas atteinte, on lit
input #1,strLigne
msgbox(strLigne)
else
'sinon
msgbox("Fin du fichier atteinte")
end if
end sub

public sub command3_click()
'on ferme le fichier
close #1
end sub


Attention, cette méthode bien que simple pose de nombreux problème, en effet, la commande input ne prend pas uniquement les retours à la ligne réelle comme séparateur, elle prend également certains signes de ponctuations comme les virgules, il n'est donc pas pratique de lire certains contenus de fichier avec une tel méthode, puisque la commande ne fait pas la différence entre une virgule et un retour à la ligne, de plus ceux-ci ne sont pas renvoyés dans la variable, il est donc impossible de savoir quel est le caractère séparateur que l'on vient de rencontrer.

De plus il est assez gênant de devoir parcourir tout le fichier pour atteindre une ligne située à la fin de celui-ci, en particulier pour les gros fichiers.

Vous pouvez enchaîner plusieurs variable dans la même commande input.
ex:

input #1,strText1,strText2,......


Dans ce cas, la commande placera le contenu d'une 1ere ligne dans la variable dans strText1 et de la ligne suivante dans strText2

Pour lire une ligne complète utilisez
line input #1, strLigne


Dans ce cas la, la seule séparation dont il tiendra compte est le retour à la ligne.

Ecriture en mode séquentiel (Output)

Bon, savoir lire un fichier c'est bien, savoir écrire dedans c'est encore mieux. Nous allons voir ici comment écrire dans un fichier en mode séquentiel.
Pour la façons d'ouvrir les fichiers allez voir ici, on emploi la même méthode que la lecture sauf qu'au lieu de mettre input vous mettez output, ceci donne :

open "c:\test.txt" for output as #1


Bon, pour commencer, créez une application, semblable à la précédente :
Un bouton "ouvrir" avec dans son évènement click la commande d'ouverture
Un bouton "Fermer" avec dans son évènement click la commande de fermeture
Une boite de texte multilignes ou non
Un bouton "Ajouter au fichier"

Il existe deux commandes d'écriture pour le mode output :

Print numéro,variable : Cette commande ajoute une ligne au fichier sélectionné et y écrit le contenu de la variable. Attention, si le fichier contient déjà du texte, tout le texte sera effacer lors de la 1ere écriture (en effet l'écriture séquentielle écrit dans le fichier ligne par ligne, mais il est impossible d'écrire à la place d'une ligne ni d'en sauter ni d'écrire avant une ligne), C'est son défaut, il nous faut toujours réécrire la totalité du fichier. Print traite indifféremment tous les types de variable.

Write numéro,variable : Cette commande est la fausse jumelle de print, elle fonctionne de la même manière à la différence qu'elle tien compte du type de variable que l'on utilise, elle n'écrit pas la même chose en fonction que la variable soit en long, string, boolean, byte...Elle est par conséquent plus performante que la commande print, suivant l'utilisation que l'on veut en faire, en effet celle-ci rajoute des marqueurs en fonction du type de variable utilisé.

Dans notre exemple nous utiliserons la commande print, mais le traitement serais le même avec write. Pour mieux comprendre la différence, je vous conseil d'essayer en modifiant le code que vous allez faire.
Placez dans l'évènement click du bouton "ajouter au fichier" les commandes suivantes :

print #1,text1.text
text1.text=""


Voila, testez, ouvrez le fichier, écrivez quelques mots dans la boite de texte et faites "Ajouter...", puis faite fermer et ouvrez le fichier avec bloc-note, vous constaterez que le texte que vous avez écrit y est ajouté.
Ecrivez maintenant un texte, ajoutez le au fichier, puis ajoutez en un ou plusieurs autres, et regardez.
Votre code devrait ressembler à ça :

private sub command1_click()
'on ouvre le fichier
open ("c:\test.txt") for ouput as #1
end sub

private sub command2_click()
'on ecrit dans le fichier
print #1,text1.text
'on efface le texte de la boite de texte
text1.text=""
end sub

private sub command3_click()
'on ferme le fichier
close #1
end sub


La différence de gestion de type de variable entre Write et Print n'offre qu'un avantage relatif pour la majorité des variables toutefois elle se démarque pour la gestion des variables de type boolean, en effet alors que la commande print écrit dans le fichier le nom Français (ou autre en fonction de la langue du PC) la valeur de la variable ce qui est problématique lors de la lecture, la commande Write elle écrit le véritable contenu de la variable en la précédant d'un #.

Vous pouvez enchaîner plusieurs variable dans la même commande Write ou Print.
ex:

write #1,strText1,strText2,...


Dans ce cas, la commande placera le contenu de la variable de strText1 dans la 1ere ligne et de strText2 dans la suivante.

3nj0y y0ur c0d1ng w1th Neku.

--Message édité par Neku le 19-02-06 à 01:11:57--
Leandre aka Neku