Tutorial fichier entree sortie mode acces, cekifosavoir koi ;p

Soyez le premier à donner votre avis sur cette source.

Vue 8 580 fois - Téléchargée 467 fois

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

Ajouter un commentaire

Commentaires

sanyohan13
Messages postés
7
Date d'inscription
mardi 2 mai 2006
Statut
Membre
Dernière intervention
23 mars 2009

très bon tut, j'avoue ne pas avoir tt compris car je débute et j'aimerai savoir comment faire por sauvegarder une richtextbox dans un ficier .xls
10/10 et merci
celiphane
Messages postés
466
Date d'inscription
samedi 16 février 2002
Statut
Membre
Dernière intervention
20 avril 2007

Salut,

Les méthodes de lectures de fichiers de VB, y compris les FSO, sont faits pour lire sur le disque dur, ou assimilé (chemin réseaux)... mais en aucun cas via le procotole HTTP, ni FTP ou autre...

Plusieurs solutions s'offrent à toi :
- faire une routine intermédiaire qui télécharge le fichier demandé avec de l'ouvrir en local (recommandé)
- utilisez ce code qui "hack" les fonctions naturelles de VB pour permettre un open http : http://www.vbfrance.com/code.aspx?ID=25953 (bidouille impressionnante mais non recommandable)
- utilisez un client WebDrive, qui transforme un chemin FTP en chemin réseau (non recommandé car oblige le programme à être dépendant d'un autre...)

@+
Celiphane
futurBosseur
Messages postés
2
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2005

Bonjour,

Bien, bon tuto, pratique... mais malheureusement je n'y ai pas trouvé la réponse a ma question.
En effet je cherche a savoir comment lire mon fichier situé sur un serveur web. Dont l'adresse serait du style : http://www.monsite.com/monfichier.txt.
J'ai essayé avec les fso et avec les méthode classique d'open.. rien n'y fait il me dit qu'il ne me trouve pas le fichier, pourtant il existe et il est lisible (permission).
Des idées ?
cs_pattenrond
Messages postés
10
Date d'inscription
mardi 1 avril 2003
Statut
Membre
Dernière intervention
28 août 2005

Bonjour à tous

Enfin un tutoriel sur le gestion des fichiers sans les API. 10/10.
Crash_overide12
Messages postés
15
Date d'inscription
lundi 13 septembre 2004
Statut
Membre
Dernière intervention
30 juillet 2006

Celiphane c décider je t'aime !!!!
Putain sa fait plus de 10h ke je boss non-stop sur un prog (je sais d fois fo ce reposer, mais bon quand on n'aime on ne compte pas.) et la jme suis dis tiens sa fais chier ya juste un truc ki m'enerve c kan je save, and kaprè je open dans une textbox a la fin sa fou un truc chelou, comm si yavais un code qui traine... EH WI cété juste ce putain de ";" a la fin de PRINT, je l'avais Krémen ZAPPER, donc je te remercie pour tous !!!! et je te mais 10/10 a ton tut' il est bien pour les débutant, et RAFRAICHIE la mémoire au "VIEUX" ! ;-)

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.