Tutorial fichier entree sortie mode acces, cekifosavoir koi ;p

Description

TUTORIAL - comment qu'on se sert des fichiers en VB ? - niveau du tut' : neuneu à costo

Tout d'abord, il faut bien savoir se représenter un ficher : c'est un flux d'octets, c'est à dire pour nous misérables humains, un tas de caractères lisibles ou non mis en bordel les un après les autres. Je dis « lisibles ou non » car dans certains cas, il s'agit juste de caractères communs intelligibles comme « A » ou « Z » ou « B » ou. bref. Vous avez à peu près compris.

La deuxième chose à savoir, c'est que ce merdier d'octet, il est souvent formaté. C'est à dire qu'il a pas été écrit aussi n'importe comment qu'il en a l'air et qu'en conséquence il ne se lit pas n'importe comment non plus.

Enfin, pour finir la sauce d'introduction, (et ça vous le savez forcément déjà) un fichier est quelque part sur une unité physique, donc il a d'une part un chemin et d'autre part un nom (puis même souvent une extension ! épatant ? ), mais comme on est en VB, et non pas chez mémé, va aussi falloir lui donné un INTEGER, un numéro quoi, pour le référencer.

On va démarrer sur un exemple bête comme chou :

§ OPEN « c:\point.txt » FOR OUTPUT AS #1

L'instruction OPEN raconte à votre prog' qu'il faut ouvrir le fichier « point.txt » situé dans le rep' « c:\ » en OUTPUT comme étant le fichier #1. Waow !

Si vous suivez bien, le seul truc que vous avez peut-être un peu de mal à interprêter c'est le mot OUTPUT : il s'agit d'un mode d'accès. Voici les 5 à retenir :

OUTPUT : ouvre un fichier VIERGE pour l'écriture (s'il est pas vierge, il le devient ! Gare !)
APPEND : ouvre un fichier pour l'écriture et place le pointeur à la fin
INPUT : ouvre un fichier EXISTANT pour la lecture (error si not exist !!!)
BINARY : ouvre un fichier en binaire, c'est à dire sans formatage de lecture / écriture
RANDOM : au pif, nan je déconne, ça sert pour écrire / lire des enregistrements (TYPE)

(j'y pense parce que je l'ai cité plus haut : le pointeur c'est comme par exemple le curseur sous le bloc-note de Windows , tu tapes il avance mais il est virtuel, ba là c'est pareil, tu écris dans le fichier il avance pareil, sauf que y'a pas de touche backspace ou delete pour revenir en arrière, enfin si, si vraiment tu veux contrôler ton pointeur, ya l'instruction SEEK, qu'on verras plus bas.)

Donc selon notre exemple, si le fichier « c:\point.txt » n'existait pas, le voilà créé prêt à recevoir nos données, si en revanche il existait, le voilà vide prêt à recevoir nos données quand même !

Disons qu'on complète notre code et qu'au final on obtient ça :

§ OPEN « c:\point.txt » FOR OUTPUT AS #1
§ WRITE #1, « ma chaîne de caractères »
§ WRITE #1, « mon âge est 20 ans »
§ WRITE #1, « mon âge est aussi », 20
§ CLOSE #1

Après l'éxécution, on va se retrouver avec sur « C:\ » le fichier « point.txt » qui va contenir :

« ma chaîne de caractères »
« mon âge est 20 ans »
« mon âge est aussi », 20

et pas autre chose si vous l'éditez avec le bloc-note par exemple.
C'est vraiment le format le plus simple qui soit pour écrire ses données. Notez bien l'instruction CLOSE #1, il faut toujours y penser, c'est mieux, elle sert à fermer votre fichier quand vous en avez fini avec. Si vous faites CLOSE tout court, vous fermez TOUS les fichiers ouverts.

Supposons qu'on veuille récupérer ces données, c'est aussi con :

§ Dim ch1, ch2, ch3 As String
§ Dim Nb as Integer
§
§ OPEN « c:\point.txt » FOR INPUT AS #1
§ INPUT #1, ch1
§ INPUT #1, ch2
§ INPUT #1, ch3, Nb
§ CLOSE #1

Vous avez compris ? On a déclaré les variables (car il faut TOUJOURS déclarer ses variables) et, notez bien le changement de mode d'accès, on a récupéré les données ! Si si ! La syntaxe de INPUT et WRITE c'est : Instruction #Fichier , var1 , var2 , . , varN

Alors déjà rien qu'avec ça, on peut aller loin, faire des sauvegardes de paramètres propres à l'utilisateur dans un prog' etc etc. car vous le savez bien les chaines écrites plus haut dans le fichier peuvent être remplacées par n'importe quel variable, pour peu que vous les récupériez bien sous leur forme à la lecture !

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
L'OPTIMISATION :
Le must du must c'est de référencer ses fichiers comme ça :

§ Dim Num as Integer
§ Num=FreeFile
§ Open MonFichier for Output As #Num
§ .
§ CLOSE #Num

FreeFile renvoie un numéro de fichier libre : c'est le plus propre du plus must du mieux mieux à faire pour éviter des conflits dans votre prog'.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Evidemment, ya plus encore que ce qu'on vient de voir :
Si on ouvre un fichier comme ça :

§ Open MonFichier For BINARY As #Num

On va décider nous même de ce qu'on va y lire, où qu'on va le faire et pareil pour y écrire !
Exemple :

§ Dim B as Byte
§ Dim S as String * 1
§ Dim S2 as String * 2
§ Dim I as Integer
§ Dim Num as Integer
§
§ Num=FreeFile
§
§ Open MonFichier For BINARY As #Num
§ Get #Num, 1, B
§ Get #Num, 2, S
§ Get #Num, , S2
§ Get #Num, , I
§ Close #Num

Disons que « MonFichier » est une variable contenant le chemin et le nom d'un fichier qui contient ça :

Abracadabra

Alors après éxécution,
- B va contenir la valeur 65
- S la chaîne « b »
- S2 la chaîne « ra »
- I la valeur 24931
Pourquoi ?
- Parce que B est un byte, valeur comprise de 0 à 255, codé sur 1 octet donc GET qui sert à PRENDRE (lire quoi) va à l'octet 1 (comme indiqué, matter la ligne.) et va récupérer un BYTE, donc A de Abracadabra étant codé en ASCII par 65 et donc inscrit physiquement comme tel, B va prendre 65 comme valeur
- S aura « b » car S est une chaîne d'un octet, et qu'à l'octet 2 la chaîne d'un octet lisible est un « b »
- S2 aura « ra » car c'est une chaîne de 2 octets et qu'à l'octet 3, la chaîne de 2 octets lisible est « ra ». MAIS AU FAIT POURQUOI CETTE FOIS 3 N'EST PAS INSCRIT COMME L'ETAIS 1 ET 2 APRES LE NUMERO DE FICHIER ??? : parce que c'est pour vous montrer qu'en omettant ce paramètre GET va lire directement à l'endroit où est le pointeur. Rappelez-vous ; le pointeur avance à chaque opération I/O sur le fichier, or comme on vient tout juste précédemment de lire en 2, alors maintenant il est en 3, donc la lecture s'opérera bien ici, et après donc il sera où ??? Sur 5 !!! Bien joué ! (ben oui, il a avancé de 2 car S2 fait 2)
- Enfin, et là seul les plus malins auront compris (dsl pour les autres ;p ), I qui est un INTEGER contient bien 24931 : « ca » est la chaîne qui est pointé puisque ce type de donnée tient sur 2 octets (soit de -32768 à 32767), mais on s'en fiche de la chaîne car I est un INTEGER, donc en réalité ce qui est pointé c'est les codes ASCII 63 et 61, soit codé en INTEGER 24931 (sortez vos cours d'architecture matériel ! moi j'explique pas le calcul. ;) )

Voilà la lecture binaire ! Alors c'était pas si compliqué que ça hein ? L'écriture ? Ba c'est quasi pareil sauf qu'on remplace GET par PUT #Fichier, Octet, Variable

Il y a aussi un autre moyen de placer son Pointeur où on veut : c'est SEEK :

§ Seek #Num, 124
§ V = Seek(Num)

Ca va aller poser le curseur à l'octet 124 du fichier Num et ensuite je vous montre comment récupérer la position du pointeur : ici V va prendre 124 (mais si, réfléchissez.)

Le Random :

Un exemple tout de suite, et détaillé, s'il vous plait !!! :

Création d'un type dans un module (volontairement dépouillé pour l'exemple) puis d'un tableau de ce type
§ TYPE Chien
§ Marque as String * 20
§ Prix as Integer
§ END TYPE
§ Public TblDeChien(1 to 20) As Chien

En supposant que votre prog' ait rempli des données dans le tableau, et que vous aimeriez les sauver pour une prochaine utilisation, voilà 2 procédures :

§ Sub SauveMesChiens()
§ Dim i as Byte
§ Dim Num as Integer : Num=Freefile 'deux trucs séparés par « : » = 2 lignes
§ Open MonFichier For Random as #Num
§ For i=1 to 20
§ PUT #Num, , TblDeChien(i)
§ Next i
§ Msgbox « Mes chiens sont sauvegardés dans mon disque. J'espère qu'ils seront sage. »
§ End Sub

§ Sub VaChercherMesChiens()
§ Dim i as Byte
§ Dim Num as Integer : Num=Freefile
§ Open MonFichier For Random as #Num
§ For i=1 to 20
§ GET #Num, , TblDeChien(i)
§ Next i
§ Msgbox « Mes chiens sont récupérés. Ils sont comme avant ! cool »
§ End Sub

Voilà, j'en dirais pas plus la dessus car ça me paraît clair ! Non ? Ba tant pis. Relisez qu'est-ce que vous voulez que je vous dise ?

Bon, approfondissons nos connaissances : un peu plus de OUTPUT / APPEND ça vous tente ?

§ OPEN « c:\point.txt » FOR OUTPUT AS #Num
§ PRINT #Num, « Maintenant j'utilise PRINT pour écrire disdonc ! »
§ Close #Num

Et mon fichier ne va contenir QUE la chaîne sans les guillemets.
La prochaine écriture PRINT derrière celle-là aurait d'abord sauté une ligne puis inscrit son bidule. Résultat : pour lire on peut utiliser un code du genre :

§ Dim Ch as string
§ Open « C:\point.txt » for Input as #Num
§ Do
§ Line Input #Num, Ch
§ Msgbox Ch
§ Loop Until EOF(1)
§ Close #Num

Et là en gros, on lit une ligne et on la place dans Ch, Ch apparaît à l'écran, on lit la suivante et ainsi de suite jusqu'à EOF(1) = TRUE c'est à dire END OF FILE IS TRUE donc Fin de fichier atteint (EOF(1)=TRUE c'est pareil que mettre EOF(1) : dans un test, on peut zapper un =TRUE ça revient au même).

Maintenant essayer un truc du genre :

§ Dim i as byte
§ OPEN « c:\point.txt » FOR OUTPUT AS #Num
§ For i=65 to 70
§ PRINT #Num, Chr(i) ;
§ Next i
§ Close #Num

ATTENTION : N'oubliez pas mon POINT VIRGULE après le Chr(i) !
Après exécution, le fichier va contenir :

ABCDEF

Parce que Chr renvoie le caractère correspondant au code ASCII passé en argument et que le petit « ; » tout con tout bête empêche INPUT d'insérer un retour chariot (traduisible et lisible comme une Chr(13) & Chr(10) ou tout bonnement sous VB la constante VBcrlf ), et parce que je le vaut bien. heu non.

Alors évidemment, dans tout ça on a fait que survoler les I/O mais c'est déjà vrmt pas mal si vous arrangez tout ça à votre sauce !
Un dernier exemple INUTILE pour sa fonction (parce que c'est évidemment better d'utiliser les fonctions faites pour ça mais aussi parce que ya sinon des moyens plus fast de le faire en manuel !!! ) mais BON pour son code et la compréhension qu'il donne !!! :

§ Sub CopieTropConne()
§ Dim C as String * 1
§ Dim F1, F2 As Integer
§
§ F1=FreeFile
§ Open Fichier1 for Binary as #F1
§
§ F2=FreeFile
§ Open Fichier2 for Output as #F2
§
§ Do
§ GET #F1 , , C
§ If EOF(F1) Then Exit Do
§ Print #F2 , C ;
§ Loop
§
§ Close
§ End Sub

Si vous avez VRMT des PB, persévérez !!! ;p
Au pire sinon tentez un msg, je répond assez svt, si j'en ai le temps et l'envie.
PS : ce tut' n'est pas exempt de bug je pense car je l'ai pas testé, je l'ai fait fissa à la demande comme bcp d'autres de mes sources.

@+ Les Vbistes !!!

Source / Exemple :


Cétait Long ?
Cétait Null ?
Un ptit comment cest toujours bon, pour gueuler ou en cas de pépin, quimporte ca fait plaisir ... @+

Conclusion :


(ps : évitez qd mm les sacages méchants & mauvais, je sais j'ai fait vite fait... ;O )

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.