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 )
Merci de poster les réponses au groupe afin d'en faire profiter à tous
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
> 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
------------------------------------------
> 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
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
Salut,
Tu peux remplacer ce caratère par un espace à l'affichage.
--
Nicolas.
http://www.ngsoft-fr.com
"Armando R." <artools@free.fr> a écrit dans le message de news:
40030856$0$29063$636a55ce@news.free.fr...
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
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
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..
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
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
' 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
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..
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
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
' 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
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..
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
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
' 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