OVH Cloud OVH Cloud

GET en binary mode

6 réponses
Avatar
Adam Pietrasiewicz
<<< Attention - mon adresse dans l'entete de ce message >>>
<<< est une adresse ANTISPAM - pour m'ecrire cliquez sur >>>
<<< http://www.cerbermail.com/?DQr0g2Y88R >>>
====================================================

Je lis un fichier en mode Binary, donc je fais

Frf=Freefile
Open "c:\monfichier.txt" for Binary as FrF

et ensuite, dans une boucle je fais des Get.

Mais je rencontre un probleme.

Mon MSDN me dit, que je PEUX utiliser un tableau dans un Get, et
j'essaye de le faire, mais sans succes.

Je fais en fait

Dim MonTableau()

.. traitement...

ReDim MonTableau(UnNombre)

et

Do
Get#Frf,Position,MonTableau

..

Et je remarque que le tableau n'est pas charge.

Je n'ai jamais utilise un tableau dans des operations comme ca, mais
j'ai lu dans MSDN que:

Note You can use the Get statement to read a Variant from disk, but
you can't use Get to read a scalar Variant containing an array. You
also can't use Get to read objects from disk.

Est-ce que je fais qqchose que je ne devrais pas faire? Je n'ai pas
beaucoup d'experience dans l'utilisation des tableaux et je ne sais
pas ce qu'est "scalar Variant" par exemple...



--
Adam Pietrasiewicz
Pologne
---
Ce message vous a ete apporte par Le Pigeon
http://www.amsoft.com.pl/golabek

6 réponses

Avatar
Zoury
Salut Adam! :O)

Tu dois dimensionner ton tableau de la taille voulue *avant* d'appeler Get.
Le get récupérera la quantité de donnée nécessaire pour remplir le tableau,
si ce dernier est vide, il ne le remplira pas.

Voici un exemple qui écrit et relit un tableau de type Long de 10 éléments :
'***
Option Explicit

Private Sub Main()

Dim i As Long
Dim l() As Long
Dim hFile As Long

' initialise le curseur
Randomize

' Rempli le tableau de 10 éléments
ReDim l(9) As Long
Debug.Print "contenu du tableau 1 : "
For i = 0 To 9
l(i) = Rnd * &HFFFF&
Debug.Print "l(" & i & ") : ", l(i)
Next i

' Écrit le fichier sur le disque
hFile = FreeFile
Open "c:montableau.txt" For Binary As #hFile
Put #hFile, , l
Close #hFile

' Efface le tableau
Erase l

' Lit le contenu du fichier dans notre tableau
hFile = FreeFile
Open "c:montableau.txt" For Binary As #hFile
' Ici on dimensionne le tableau
' On prend la taille total du fichier
' divisé par 4 octets, ce qui nous
' donne le nombre d'éléments a récupérer
ReDim l(LOF(hFile) 4) As Long
Get #hFile, , l
Close #hFile

' Imprime le contenu pour le comparer a
' celui du début
Debug.Print "contenu du tableau 2 : "
For i = 0 To 9
Debug.Print "l(" & i & ") : ", l(i)
Next i

End Sub
'***

Résultats :
contenu du tableau 1 :
l(0) : 1552
l(1) : 38971
l(2) : 22868
l(3) : 7990
l(4) : 25101
l(5) : 52242
l(6) : 9824
l(7) : 48739
l(8) : 45459
l(9) : 38480
contenu du tableau 2 :
l(0) : 1552
l(1) : 38971
l(2) : 22868
l(3) : 7990
l(4) : 25101
l(5) : 52242
l(6) : 9824
l(7) : 48739
l(8) : 45459
l(9) : 38480

--
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 a tous
Avatar
Zoury
ReSalut! :O)

Note You can use the Get statement to read a Variant from disk, but
you can't use Get to read a scalar Variant containing an array. You
also can't use Get to read objects from disk.

Est-ce que je fais qqchose que je ne devrais pas faire? Je n'ai pas
beaucoup d'experience dans l'utilisation des tableaux et je ne sais
pas ce qu'est "scalar Variant" par exemple...



Je crois qu'il s'agit simplement d'un variant contenant un tableau. :

'***
Dim v As Variant
Dim l(5) As Long
v = l ' v devient un Variant contenant un Long()
'***

Il est donc impossible d'écrire/lire des objects ou un Variant contenant un
tableau.

--
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 a tous
Avatar
Adam Pietrasiewicz
<<< Attention - mon adresse dans l'entete de ce message >>>
<<< est une adresse ANTISPAM - pour m'ecrire cliquez sur >>>
<<< http://www.cerbermail.com/?DQr0g2Y88R >>>
=================================================== Le 04 listopada 2003 00:38:56 Zoury a ecrit dans un message
news:



Salut Adam! :O)

Tu dois dimensionner ton tableau de la taille voulue *avant* d'appeler Get.
Le get récupérera la quantité de donnée nécessaire pour remplir le tableau,
si ce dernier est vide, il ne le remplira pas.



Merci, je vais regarder et tester ca demain, maintenant - DODO! ...

je crois quand mem que je fais mal quelque chose, et je ne sais pas
quoi car en principe je faisais comme tu disais.

Voici le code complet:

Private Sub SendFile(NomFichier as String)
On Error Resume Next
Dim Zone As String
Dim Tableau()
ReDim Tableau(2048)
Dim Position As Long
Dim Frf As Long
Dim OctetsEnvoyes as Long

Position = 1
Frf = FreeFile
Open NomFichier For Binary As Frf

Do Until OctetsEnvoyes >= Int(FileLen(NomFichier))
Get #Frf, Position , Tableau
Position = Position + UBound(Tableau)
Zone = Join(Tableau)
If Surcharge > 0 Then
ReDim Tableau(Int(UBound(Tableau) * 0.9))
Else
ReDim Tableau(Int(UBound(Tableau) * 1.1))
End If
Do Until PozostajeDoWyslania = 0
DoEvents
Loop
Winsock1.SendData Trim(Zone )
Print #Frf1, Trim(Zone )
DoEvents
OctetsEnvoyes = OctetsEnvoyes + Len(Trim(Zone ))
Loop
Close #Frf

End Sub

En fait le but est de gerer dynamiquement la quantites de donnees
balancees sur le Winsock pour envoi des mails.

Le probleme, que la ligne:

Get #Frf, Position , Tableau

me donne tout simplement du vide - je fais des debug.print sur
plusieurs positions du tableau et RIEN!

Ou bien je fais une erreur BETE que je ne vois pas, ou bien cela ne
fonctionne pas comme je voudrais. Je ne sais donc meme pas si mon
idee
est viable...


Le fichier sur lequel j'opere existe, donc en princpe l'erreur n'est
pas la. Le Get s'effectue sans probleme, mais il donne du vide.

--
Adam Pietrasiewicz
Pologne
---
Ce message vous a ete apporte par Le Pigeon
http://www.amsoft.com.pl/golabek
Avatar
Adam Pietrasiewicz
<<< Attention - mon adresse dans l'entete de ce message >>>
<<< est une adresse ANTISPAM - pour m'ecrire cliquez sur >>>
<<< http://www.cerbermail.com/?DQr0g2Y88R >>>
=================================================== Le 04 listopada 2003 01:04:33 Adam Pietrasiewicz a ecrit dans un
message news:



<<< Attention - mon adresse dans l'entete de ce message
<<< est une adresse ANTISPAM - pour m'ecrire cliquez sur
<<< http://www.cerbermail.com/?DQr0g2Y88R
================================================== > Le 04 listopada 2003 00:38:56 Zoury a ecrit dans un message
news:



Salut Adam! :O)



Tu dois dimensionner ton tableau de la taille voulue *avant* d'appeler Get.
Le get récupérera la quantité de donnée nécessaire pour remplir le tableau,
si ce dernier est vide, il ne le remplira pas.



Merci, je vais regarder et tester ca demain, maintenant - DODO! ...

je crois quand mem que je fais mal quelque chose, et je ne sais pas
quoi car en principe je faisais comme tu disais.

Voici le code complet:

Private Sub SendFile(NomFichier as String)
On Error Resume Next
Dim Zone As String
Dim Tableau()
ReDim Tableau(2048)
Dim Position As Long
Dim Frf As Long
Dim OctetsEnvoyes as Long

Position = 1
Frf = FreeFile
Open NomFichier For Binary As Frf

Do Until OctetsEnvoyes >= Int(FileLen(NomFichier))
Get #Frf, Position , Tableau
Position = Position + UBound(Tableau)
Zone = Join(Tableau)
If Surcharge > 0 Then
ReDim Tableau(Int(UBound(Tableau) * 0.9))
Else
ReDim Tableau(Int(UBound(Tableau) * 1.1))
End If




Bon, la ca devrait etre, en francais:

Surcharge

Do Until Surcharge = 0

Et non pas, en polonais

Do Until PozostajeDoWyslania = 0




DoEvents
Loop
Winsock1.SendData Trim(Zone )
Print #Frf1, Trim(Zone )
DoEvents
OctetsEnvoyes = OctetsEnvoyes + Len(Trim(Zone ))
Loop
Close #Frf

End Sub

En fait le but est de gerer dynamiquement la quantites de donnees
balancees sur le Winsock pour envoi des mails.

Le probleme, que la ligne:

Get #Frf, Position , Tableau

me donne tout simplement du vide - je fais des debug.print sur
plusieurs positions du tableau et RIEN!

Ou bien je fais une erreur BETE que je ne vois pas, ou bien cela ne
fonctionne pas comme je voudrais. Je ne sais donc meme pas si mon
idee
est viable...


Le fichier sur lequel j'opere existe, donc en princpe l'erreur n'est
pas la. Le Get s'effectue sans probleme, mais il donne du vide.




--
Adam Pietrasiewicz
Pologne
---
Ce message vous a ete apporte par Le Pigeon
http://www.amsoft.com.pl/golabek
Avatar
Patrice Henrio
Scalar variant est un variant d'un type numérique, ou aussi comme indiqué un
tableau de nombres. Scalaire veut dire numérique en anglais et en français.
"Adam Pietrasiewicz" a écrit dans le
message de news:
<<< Attention - mon adresse dans l'entete de ce message >>>
<<< est une adresse ANTISPAM - pour m'ecrire cliquez sur >>>
<<< http://www.cerbermail.com/?DQr0g2Y88R >>>
=================================================== >
Je lis un fichier en mode Binary, donc je fais

Frf=Freefile
Open "c:monfichier.txt" for Binary as FrF

et ensuite, dans une boucle je fais des Get.

Mais je rencontre un probleme.

Mon MSDN me dit, que je PEUX utiliser un tableau dans un Get, et
j'essaye de le faire, mais sans succes.

Je fais en fait

Dim MonTableau()

.. traitement...

ReDim MonTableau(UnNombre)

et

Do
Get#Frf,Position,MonTableau

..

Et je remarque que le tableau n'est pas charge.

Je n'ai jamais utilise un tableau dans des operations comme ca, mais
j'ai lu dans MSDN que:

Note You can use the Get statement to read a Variant from disk, but
you can't use Get to read a scalar Variant containing an array. You
also can't use Get to read objects from disk.

Est-ce que je fais qqchose que je ne devrais pas faire? Je n'ai pas
beaucoup d'experience dans l'utilisation des tableaux et je ne sais
pas ce qu'est "scalar Variant" par exemple...



--
Adam Pietrasiewicz
Pologne
---
Ce message vous a ete apporte par Le Pigeon
http://www.amsoft.com.pl/golabek





Avatar
Zoury
Merci Patrice! :O)