OVH Cloud OVH Cloud

Pb affichage contenu fichier binaire

5 réponses
Avatar
Armando R.
Bonjour,

J'écris le contenu d'un fichier binaire dans une chaîne.
Quand j'essaie d'afficher cette chaîne dans un TextBox, elle ne s'affiche
que jusqu'à la rencontre d'un caractère "nul" ( équivalent à 0x00 en hexa )

Comment remédier à ce problème ?

Merci d'avance pour votre aide

5 réponses

Avatar
Zoury
Salut! :O)

Peut-on voir ton code et un exemple du contenu du contenu du fichier?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Armando R.
> Peut-on voir ton code et un exemple du contenu du contenu du fichier?


------------------------------------------
'ajouter un control "Common Dialog" et un "TextBox"

Option Explicit
Private NomFich, strFich As String

Private Sub Form_Load()
Me.CommonDialog1.ShowOpen
NomFich = Me.CommonDialog1.FileName
Open NomFich For Binary As #1
strFich = String$(LOF(1), " ")
Get #1, , strFich
Close #1
Me.Text1.Text = strFich
End Sub
------------------------------------------

Merci
Avatar
ng
Salut,
Tu peux remplacer ce caratère par un espace à l'affichage.

--
Nicolas.
http://www.ngsoft-fr.com
"Armando R." a écrit dans le message de news:
40030856$0$29063$
Bonjour,

J'écris le contenu d'un fichier binaire dans une chaîne.
Quand j'essaie d'afficher cette chaîne dans un TextBox, elle ne s'affiche
que jusqu'à la rencontre d'un caractère "nul" ( équivalent à 0x00 en


hexa )

Comment remédier à ce problème ?

Merci d'avance pour votre aide




Avatar
Zoury
Salut Armando! :O)

Ton code devrait fonctionner... peut-être as-tu oublié de placer la
propriété MultiLine du TextBox à True ou encore que cette propriété est à
True, mais que ton TextBox n'est pas assez grand (en hauteur) et affiche
seulement la première ligne...? Si tel n'est pas le cas, veux-tu me poster
ton projet test avec ton fichier?


Quelques petites notes... remarques que tu as posté un projet test alors tu
sais peut-être déjà tout ça.. ;O)

Private NomFich, strFich As String



Je ne sais pas si c'est ce que tu voulais faire, mais la variable NomFich
sera déclaré As Variant et non As String comme le code peut le laisser
croire.. Même si tu déclares plusieurs variables sur la même ligne, tu dois
*absolument* spécifier le type pour chacune d'entre elle sinon elles seront
déclarées avec le type par défaut..

Aussi.. pourquoi ne pas déclaré ces variables *dans* la fonction au lieu de
les déclarés au niveau du module? Tu n'en fait pas usage ailleurs..



NomFich = Me.CommonDialog1.FileName
Open NomFich For Binary As #1



je te conseilles de vérifier la valeur retournée par la boite de dialogue
avant de tenter l'ouverture du fichier. Si l'utilisateur à cliquer sur
Annuler, tu pourrais retrouver (ça dépend si tu as mit un fichier par défaut
dans la propriété FileName) avec une chaine vide, se qui déclenchera
l'erreur 75 lorsque tu tenteras d'ouvrir le fichier..

je te conseilles également d'utiliser la propriété FreeFile afin d'obtenir
le prochain numéro de fichier disponible.. cela te permettra de rendre ton
code plus portable en plus de d'éviter des erreurs. C'est particulièrement
important dans les projets où plusieurs fichiers sont utilisés..



strFich = String$(LOF(hFile), " ")



Tu peux utiliser la fonction Space$() qui serait plus rapide ( et plus
lisible ) (voir BenchMark à la fin du message pour les curieux..)


Voici donc le nouveau bout de code..
'***
Option Explicit

Private Sub Form_Load()

Dim NomFich As String
Dim strFich As String
Dim hFile As Long ' Peut-être Integer.. mais Long est plus rapide..

Me.CommonDialog1.ShowOpen
NomFich = Me.CommonDialog1.FileName

If (LenB(NomFich) > 0) Then
hFile = FreeFile
Open NomFich For Binary As #hFile
strFich = Space$(LOF(hFile))
Get #hFile, , strFich
Close #hFile
Me.Text1.Text = strFich
End If

End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous

Voici un BenchMark qui compare différentes manières employées pour créer un
"buffer"
'***
' Module1
Option Explicit

Private Sub Main()

Const NUM_LOOP As Long = 100000
Const STRING_LEN As Long = 256
Dim i As Long
Dim sw As CStopWatch
Dim tLoop As Long
Dim t1 As Long
Dim t2 As Long
Dim t3 As Long
Dim t4 As Long
Dim t5 As Long
Dim t6 As Long
Dim t7 As Long
Dim s As String

Set sw = New CStopWatch

sw.Reset
For i = 0 To NUM_LOOP
Next i
tLoop = sw.Elapsed

sw.Reset
For i = 0 To NUM_LOOP
s = Space(STRING_LEN)
Next i
t1 = sw.Elapsed

sw.Reset
For i = 0 To NUM_LOOP
s = Space$(STRING_LEN)
Next i
t2 = sw.Elapsed

sw.Reset
For i = 0 To NUM_LOOP
s = String(STRING_LEN, " ")
Next i
t3 = sw.Elapsed

sw.Reset
For i = 0 To NUM_LOOP
s = String$(STRING_LEN, " ")
Next i
t4 = sw.Elapsed

sw.Reset
For i = 0 To NUM_LOOP
s = String$(STRING_LEN, Chr(32))
Next i
t5 = sw.Elapsed

sw.Reset
For i = 0 To NUM_LOOP
s = String$(STRING_LEN, Chr$(32))
Next i
t6 = sw.Elapsed

sw.Reset
For i = 0 To NUM_LOOP
s = String$(STRING_LEN, 32)
Next i
t7 = sw.Elapsed

Debug.Print "Nombre de boucles : " & NUM_LOOP
Debug.Print "Temps de la boucle : " & tLoop & " ms"
Debug.Print "Space() : " & t1 - tLoop & " ms"
Debug.Print "Space$() : " & t2 - tLoop & " ms"
Debug.Print "String() et "" "" : " & t3 - tLoop & " ms"
Debug.Print "String$() et "" "" : " & t4 - tLoop & " ms"
Debug.Print "String$() et Chr(32) : " & t5 - tLoop & " ms"
Debug.Print "String$() et Chr$(32) : " & t6 - tLoop & " ms"
Debug.Print "String$() et 32 : " & t7 - tLoop & " ms"

End Sub
'***

' Résultats
Nombre de boucles : 100000
Temps de la boucle : 1 ms
Space() : 40 ms
Space$() : 31 ms
String() et " " : 72 ms
String$() et " " : 56 ms
String$() et Chr(32) : 59 ms
String$() et Chr$(32) : 56 ms
String$() et 32 : 41 ms


La classe CStopWatch est disponible à cette adresse :
http://www.mvps.org/vb/samples.htm
Avatar
Armando R.
Merci, pour tous ces renseignements precieux.