OVH Cloud OVH Cloud

Lire un fichier binaire en vb

20 réponses
Avatar
Superman
Bonjour,

Je suis un novice dans le monde du VB et il faut que je lise un
fichier binaire constitu=E9e commme ceci :

le fichier contient n enregistrements

chaque enregistrement est constitu=E9e de :
une taille sur 1 octet
un num sur 21 octets
une date sur 4 octets
un autre num sur 21 octets
puis de n bloc de 2 octets

J'aurais besoin d'aide s'il vous plait :
J'ai deja commencer =E0 coder :


dim taille as integer

Open "nom fichier" For Binary As #f
get, ,integer

et puis ensuite je ne sais pas trop quoi faire.... pour le bloc de 21
octets sachant qu'en plus je dois inserer tout ceci dans un fichier
texte ensuite...

Merci de votre aide !

Maxime

10 réponses

1 2
Avatar
Superman
Ah pour savoir il va y en avoir combien c simple pcq le premier nombre
qui correspond a la taille de l'enregistrement donc on aura des
paquets constituées

la taille de l'enregistrement
un num sur 21 octets
une date sur 4 octets
un autre num sur 21 octets
puis de n bloc de 2 octets jusqua taille

Merci
Avatar
Superman
Bonjour a tous,

je voudrais tous d'abord vous remercier de votre aide !

Je vous fais un recapitulatif de mon cachier des charges et d'ou j'en
suis actuellement :

Alors tous d'abord, j'ai un fichier binaire constituée de n
enregistrements :
chaque enregistrement est composé de
sa taille 1 octet
un num 21 octet
une date 4 octet
un num 21 octet
puis de N identifiant de 2 octets jusqu'a la fin de l'enregistrement
(sa taille est donné sur le premier octet !)
Ensuite vous avez soit un autre enregistrement soit le fichier est
terminé.

Bien evidemment chaque paramtre doit etre recopier dans un fichier
texte chaque parametre doit etre espacé d'une tabulation et on passe a
la ligne des que l'on passe a un autre enregistrement.

Type entete
taille As Byte
num1 As String * 21
date As Date
num2 As String * 21
End Type


Private Sub Command1_Click()

Dim f As Integer
Dim e As entete
f = FreeFile
Dim index As Integer
Dim ID_Film As String * 2
index = 1

'Creation du fichier texte
Open "C:test.txt" For Output As #1
Close #1

Open "C:2007-06-15.bin" For Binary As f
Do While (1) 'boucle infini pour la lecture du fichier en entier
Get f, index, e
Close #f
If e.taille = 0 Then 'Si E.taille est nul on termine la lecture et
on sort !
Exit Sub
End If
Open "C:test.txt" For Append As #1 ' on recopie notre structure
dans le fichier texte avec des tabulations
Print #1, e.taille & Chr(9) & e.num1 & Chr(9) & e.date & Chr(9) &
e.num2;
Close #1

For i = 48 To e.taille ' boucle pour récuperer les ID de 2 octets
Open "C:2007-06-15.bin" For Binary As f
Get f, i, ID_Film
Close #f
Open "C:test.txt" For Append As #1
Print #1, Chr(9) & ID_Film;
Close #1
i = i + 2 'on incremente l'index de 2 octets
Next

'On passe a la ligne suivante car on a terminé un enregistrement
Open "C:test.txt" For Append As #1
Print #1, vbNewLine;
Close #1
index = index + e.taille ' lncrementation de l'index pour
commencer directement au deuxieme enregistrement
Open "C:2007-06-15.bin" For Binary As f
Loop
Close #f
End Sub


Ce que je fais est 'il correcte ?

Merci de votre aide
Avatar
tking
Superman a pensé très fort :


Open "C:2007-06-15.bin" For Binary As f
Do While (1) 'boucle infini pour la lecture du fichier en entier
Get f, index, e



C'est quoi ce Close après un Get ? Le Do ne sert à rien. Et le
While(1) n'est pas bon je pense, un

do while not eof(f) qui veut dire tant que la fin du fichier "f" n'est
pas atteint on continu, est plus interessant. le loop vient avant le
close

Close #f



Inutile à ce stade donc.

Le reste est assez brouillon, :) mais si tu pouvais poster ton fichier
bin sur un site d'upload, comme http://cjoint.com/ ça aidera tous le
monde ici.

a+
Avatar
Superman
ba en fait si je referme a chaque fois le fichier c'est simplement
parceque je n'arrive pas a ouvrir deux fichiers en meme temps...

Exemple :
Open "C:2007-06-15.bin" For Binary As f
Open "C:test.txt" For Output As #1

lors du lancement il me met toujours file already open...
Avatar
Aski
Hello Superman,

Tu as savamment écrit :

ba en fait si je referme a chaque fois le fichier c'est simplement
parceque je n'arrive pas a ouvrir deux fichiers en meme temps...

Exemple :
Open "C:2007-06-15.bin" For Binary As f
Open "C:test.txt" For Output As #1

lors du lancement il me met toujours file already open...



Prends f = FreeFile pour le premier et f+1 pour le second.
Tu peux ouvrir plusieurs fichiers en même temps pourvu qu'ils n'aient pas le
même numéro.
Avatar
LE TROLL
Bonjour,

Tiens, testé, tu mets ça dans ta forme et ça
marche en VB5, je ne te passe pas la form vb 6 car
je ne crois pas qu'elle soit accepté par vb5,
dis-moi si c'est ça ???

---------------------------------------

' programme binaire form 1
'
Option Explicit
'
Sub Form_Load()
' charge du fichier pour test
Dim p01a As Long
Dim p01b As Long
Dim p01c As Long
Dim i As Long
Dim j As Long
Dim ligne As String
Dim rep
'
Dim Etaille As Byte ' 1 ' donne la taille
Dim E21a As String * 21
Dim Edate As Long ' 4
Dim E21b As String * 21 '
Dim En As Integer ' 2
'
Dim Ltaille As Byte ' 1 ' donne la taille
Dim L21 As String * 21
Dim Ldate As Long ' 4
Dim Ln() As Integer ' 2
'
ChDrive App.Path
ChDir App.Path
On Error Resume Next
Kill "binaire.bin"
'
p01a = FreeFile
Open "binaire.bin" For Binary As p01a
Etaille = 55 ' 1
Put p01a, 1, Etaille
E21a = "123456789012345678912" ' 21 = 22
Put p01a, , E21a
Edate = Date ' 4 = 26
Put p01a, , Edate
E21b = "987654321098765432109" ' 21 = 47
Put p01a, , E21b
En = 123 ' 2 = 49
Put p01a, , En
En = 234 ' 2 = 51
Put p01a, , En
En = 345 ' 2 = 53
Put p01a, , En
En = 456 ' 2 = 55
Put p01a, , En
'
Etaille = 53 ' - 47 = 3 blocs de 2 = 6... = 56
Put p01a, , Etaille
E21a = "123456789121234567890" ' 21 = 77
Put p01a, , E21a
Edate = Date + 1 ' 4 = 81
Put p01a, , Edate
E21b = "109876543210998765432" ' 21 = 102
Put p01a, , E21b
En = 8723 ' 2 = 104
Put p01a, , En
En = 9834 ' 2 = 106
Put p01a, , En
En = 7345 ' 2 = 108
Put p01a, , En
'
Etaille = 51 ' - 47 = 3 blocs de 2 = 4... 109
Put p01a, , Etaille
E21a = "123456734567890891212" ' 21 = 130
Put p01a, , E21a
Edate = Date + 2 ' 4 = 134
Put p01a, , Edate
E21b = "109879987654326543210" ' 21 = 155
Put p01a, , E21b
En = 8725 ' 2 = 157
Put p01a, , En
En = 9836 ' 2 = 159 octets
Put p01a, , En
Close p01a
'
'----------------------------
'
' lecture du fichier
p01c = FreeFile
Open "texte.txt" For Output As p01c
'
p01b = FreeFile
Open "binaire.bin" For Binary As p01b
Do While EOF(p01b) = False
Get p01b, , Ltaille
j = (Ltaille - 47) / 2 ' n 2 oct
ligne = "début " & Trim(CStr(Ltaille))
If ligne = "début 0" Then Exit Do
Print #p01c, ligne
'
Get p01b, , L21
ligne = CStr(L21)
ligne = Trim(ligne)
Print #p01c, ligne
'
Get p01b, , Ldate
ligne = CDate(Ldate)
Print #p01c, ligne
'
Get p01b, , L21
ligne = CStr(L21)
ligne = Trim(ligne)
Print #p01c, ligne
'
ReDim Ln(j)
For i = 1 To j
Get p01b, , Ln(i)
ligne = CStr(Ln(i))
Print #p01c, ligne
Next i
Loop
Close p01b
Close p01c
'
rep = Shell("NotePad.exe " & App.Path &
"texte.txt", 1)
Unload Form1
End
End Sub

---------------------------



Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Superman" a écrit dans le
message de news:

Bonjour,

Je suis un novice dans le monde du VB et il faut
que je lise un
fichier binaire constituée commme ceci :

le fichier contient n enregistrements

chaque enregistrement est constituée de :
une taille sur 1 octet
un num sur 21 octets
une date sur 4 octets
un autre num sur 21 octets
puis de n bloc de 2 octets

J'aurais besoin d'aide s'il vous plait :
J'ai deja commencer à coder :


dim taille as integer

Open "nom fichier" For Binary As #f
get, ,integer

et puis ensuite je ne sais pas trop quoi faire....
pour le bloc de 21
octets sachant qu'en plus je dois inserer tout
ceci dans un fichier
texte ensuite...

Merci de votre aide !

Maxime
Avatar
tking
Aski a présenté l'énoncé suivant :
Hello Superman,

Tu as savamment écrit :

ba en fait si je referme a chaque fois le fichier c'est simplement
parceque je n'arrive pas a ouvrir deux fichiers en meme temps...

Exemple :
Open "C:2007-06-15.bin" For Binary As f
Open "C:test.txt" For Output As #1

lors du lancement il me met toujours file already open...



Prends f = FreeFile pour le premier et f+1 pour le second.
Tu peux ouvrir plusieurs fichiers en même temps pourvu qu'ils n'aient pas le
même numéro.



Ou même un autre Freefile sans incrementation.
Avatar
tking
Superman avait écrit le 18/06/2007 :
ba en fait si je referme a chaque fois le fichier c'est simplement
parceque je n'arrive pas a ouvrir deux fichiers en meme temps...

Exemple :





Open "C:2007-06-15.bin" For Binary As f
Open "C:test.txt" For Output As #1



Comme déjà dit, utilise Freefile, ou alors As #1 pour le premier et As
#2 pour le second, ...

get #1,

Close #1

...
Avatar
andre.araste
Bonjour

Travail sur les fichiers en mode texte.

Il y a quelques années de cela j'ai réalisé une étude technique sur la
gestion des différents fichiers en mode texte. Si mes souvenirs sont bons,
il y a 5 volets.

Si ça vous intéresse, vous pouvez me les demander pour attachement en privé.
--
Bonne réception.

http://perso.orange.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.



"Superman" a écrit dans le message de news:

Bonjour,

Je suis un novice dans le monde du VB et il faut que je lise un
fichier binaire constituée commme ceci :

le fichier contient n enregistrements

chaque enregistrement est constituée de :
une taille sur 1 octet
un num sur 21 octets
une date sur 4 octets
un autre num sur 21 octets
puis de n bloc de 2 octets

J'aurais besoin d'aide s'il vous plait :
J'ai deja commencer à coder :


dim taille as integer

Open "nom fichier" For Binary As #f
get, ,integer

et puis ensuite je ne sais pas trop quoi faire.... pour le bloc de 21
octets sachant qu'en plus je dois inserer tout ceci dans un fichier
texte ensuite...

Merci de votre aide !

Maxime
Avatar
Superman
C'est bon j'ai terminé !!!

Merci encore de votre aide !!
1 2