Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pblm ecriture fichier binaire

10 réponses
Avatar
Zeg
Salut,
Je tente d'ecrire dans un fichier binaire à l'aide de fonctions que j'ai
défini, qui gere le numero de canal:

Rem ======================================================
Rem AllocCanal
Rem ======================================================
Rem Desc: Retourne un numero de canal libre pour pouvoir l'associé a un
fichier
Rem attibué séquentiellemnent parmis le tableau global tabAllocCanal
Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem =====================================================
Function AllocCanal(PathName As String) As Integer
Rem Essaie d'Allocation d'un nouveau numero de canal par
affectation d'un indice supp au TabAllocCanal Public
If FTAC < UBound(TabAllocCanal) Then
Rem affectation d'un nouveau numero de canal dans
le tabAllocCanal
TabAllocCanal(FTAC).nom = PathName
TabAllocCanal(FTAC).numero = FTAC
Rem Incrémentation de FTAC
FTAC = FTAC + 1
Rem Resultat
Debug.Print FTAC
AllocCanal = FTAC
Else
Rem Le tableau est plein
MsgBox "Saturation"
Exit Function
End If

End Function



Rem ======================================================
Rem RechercheAllocCanal
Rem ======================================================
Rem Desc: Retourne le numero de canal associé au fichier
Rem
Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem =====================================================
Function RechercheAllocCanal(FilePathName As String) As Integer
Dim i As Integer
i = 1
Rem Retrouve le numero de canal associé au fichier
Rem Attention s'il n a pas été associé avt => boucle infinie
Do While TabAllocCanal(i).nom <> FilePathName And i <= FTAC
i = i + 1
Loop
Debug.Print TabAllocCanal(i).nom
Debug.Print TabAllocCanal(i).numero
RechercheAllocCanal = TabAllocCanal(i).numero

End Function

Et j'ai une erreur sur la ligne *, le msg d'erreur est "nom ou numero de
fichier incorrect" pourtant le numero semble être le bon!!

Function Lire(FilePathName As String, Tampon As String, Optional OctetDébut
As Integer = 1) As String
*Get RechercheAllocCanal(FilePathName), OctetDébut, Tampon
Lire = Tampon
End Function

Merci d'avance pour votre aide, j' ai dejà passer plusieurs heures (genre
beaucoup trop pr ça) ;)

10 réponses

Avatar
Zeg
Pblem identique pour la lecture et l'ecriture. J'ai parlé d'ecriture ds mon
1er post et j'ai mis la lecture :)

Sub Ecrire(FilePathName As String, Tampon As String, Optional OctetDébut As
Integer = 1)

Put RechercheAllocCanal(FilePathName), OctetDébut, Tampon

End Sub


"Zeg" a écrit dans le message de news:
407bfea8$0$22864$
Salut,
Je tente d'ecrire dans un fichier binaire à l'aide de fonctions que j'ai
défini, qui gere le numero de canal:

Rem ===================================================== > Rem AllocCanal
Rem ===================================================== > Rem Desc: Retourne un numero de canal libre pour pouvoir l'associé a un
fichier
Rem attibué séquentiellemnent parmis le tableau global tabAllocCanal
Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== > Function AllocCanal(PathName As String) As Integer
Rem Essaie d'Allocation d'un nouveau numero de canal par
affectation d'un indice supp au TabAllocCanal Public
If FTAC < UBound(TabAllocCanal) Then
Rem affectation d'un nouveau numero de canal


dans
le tabAllocCanal
TabAllocCanal(FTAC).nom = PathName
TabAllocCanal(FTAC).numero = FTAC
Rem Incrémentation de FTAC
FTAC = FTAC + 1
Rem Resultat
Debug.Print FTAC
AllocCanal = FTAC
Else
Rem Le tableau est plein
MsgBox "Saturation"
Exit Function
End If

End Function



Rem ===================================================== > Rem RechercheAllocCanal
Rem ===================================================== > Rem Desc: Retourne le numero de canal associé au fichier
Rem
Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== > Function RechercheAllocCanal(FilePathName As String) As Integer
Dim i As Integer
i = 1
Rem Retrouve le numero de canal associé au fichier
Rem Attention s'il n a pas été associé avt => boucle infinie
Do While TabAllocCanal(i).nom <> FilePathName And i < FTAC
i = i + 1
Loop
Debug.Print TabAllocCanal(i).nom
Debug.Print TabAllocCanal(i).numero
RechercheAllocCanal = TabAllocCanal(i).numero

End Function

Et j'ai une erreur sur la ligne *, le msg d'erreur est "nom ou numero de
fichier incorrect" pourtant le numero semble être le bon!!

Function Lire(FilePathName As String, Tampon As String, Optional


OctetDébut
As Integer = 1) As String
*Get RechercheAllocCanal(FilePathName), OctetDébut, Tampon
Lire = Tampon
End Function

Merci d'avance pour votre aide, j' ai dejà passer plusieurs heures (genre
beaucoup trop pr ça) ;)




Avatar
ng
Bonjour,

Pourquoi s'embéter avec de telles procédures de recherche de canal libre ?!

De plus je ne vois aucun open nulle part ?!!


Function Lire(FilePathName As String, Tampon As String, Optional OctetDebut
As Integer = 1) As String
Dim k as integer
k= freefile '//Recherche d'un "canal" libre
open FilePathName For Binary as #k
Get #k, OctetDebut, Tampon
Close #k
Lire = Tampon:Tampon=""
End Function

Avez-vous vraiment besoin du paramètre tampon (car il faut auparavant lui
allouer une taille) ? Car on pourrait s'en passer :

Function Lire(FilePathName As String, intNbOctetsALire as Integer, Optional
OctetDebut As Integer = 1) As String
Dim k as integer, sBuff as string
sBuff = Space$(intNbOctetsALire)
k= freefile
open FilePathName For Binary as #k
Get #k, OctetDebut, sBuff
Close #k
Lire = sBuff:sBuff=""
End Function

Note : cette fonction permet de lire intNbOctetsALire de FilePathName à
partir de l'octet OctetDebut

Pour tout lire à partir de OctetDebut :

Function Lire(FilePathName As String, Optional OctetDebut As Integer = 1) As
String
Dim k as integer, sBuff as string
k= freefile
open FilePathName For Binary as #k
sBuff = Space$(LOF(k))
Get #k, OctetDebut, sBuff
Close #k
Lire = sBuff:sBuff=""
End Function

On pourrait également directement travailler avec Lire (en tant que
variable) à la place de Buff.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Zeg a écrit :

Salut,
Je tente d'ecrire dans un fichier binaire à l'aide de fonctions que
j'ai défini, qui gere le numero de canal:

Rem ===================================================== > Rem AllocCanal
Rem ===================================================== > Rem Desc: Retourne un numero de canal libre pour pouvoir l'associé a
un fichier
Rem attibué séquentiellemnent parmis le tableau global
tabAllocCanal Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== > Function AllocCanal(PathName As String) As Integer
Rem Essaie d'Allocation d'un nouveau numero de canal par
affectation d'un indice supp au TabAllocCanal Public
If FTAC < UBound(TabAllocCanal) Then
Rem affectation d'un nouveau numero de
canal dans le tabAllocCanal
TabAllocCanal(FTAC).nom = PathName
TabAllocCanal(FTAC).numero = FTAC
Rem Incrémentation de FTAC
FTAC = FTAC + 1
Rem Resultat
Debug.Print FTAC
AllocCanal = FTAC
Else
Rem Le tableau est plein
MsgBox "Saturation"
Exit Function
End If

End Function



Rem ===================================================== > Rem RechercheAllocCanal
Rem ===================================================== > Rem Desc: Retourne le numero de canal associé au fichier
Rem
Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== > Function RechercheAllocCanal(FilePathName As String) As Integer
Dim i As Integer
i = 1
Rem Retrouve le numero de canal associé au fichier
Rem Attention s'il n a pas été associé avt => boucle
infinie Do While TabAllocCanal(i).nom <>
FilePathName And i <= FTAC i = i + 1
Loop
Debug.Print TabAllocCanal(i).nom
Debug.Print TabAllocCanal(i).numero
RechercheAllocCanal = TabAllocCanal(i).numero

End Function

Et j'ai une erreur sur la ligne *, le msg d'erreur est "nom ou numero
de fichier incorrect" pourtant le numero semble être le bon!!

Function Lire(FilePathName As String, Tampon As String, Optional
OctetDébut As Integer = 1) As String
*Get RechercheAllocCanal(FilePathName), OctetDébut, Tampon
Lire = Tampon
End Function

Merci d'avance pour votre aide, j' ai dejà passer plusieurs heures
(genre beaucoup trop pr ça) ;)


Avatar
François Picalausa
Hello!

Dans ton allocCanal, je te conseille d'emploie FreeFile pour retrouver un
numéro de fichier dont tu pourra être certain qu'il est libre.

Voici un code qui icifonctionne bien.
Les corrections faites sont précédées de 'EDIT:
Option Explicit

Private Type AllocCanal
nom As String
numero As Integer
End Type

Private TabAllocCanal(1) As AllocCanal
Private FTAC As Long

'===================================================== ' AllocCanal
'===================================================== 'Desc: Retourne un numero de canal libre pour pouvoir l'associé a un
' fichier
' attibué séquentiellemnent parmis le tableau global tabAllocCanal
'
'
' Entrée : String : FilePathName
' Sortie : Integer : numéro de canal
'
' ==================================================== Function AllocCanal(PathName As String) As Integer
'Essaie d'Allocation d'un nouveau numero de canal par
'affectation d 'un indice supp au TabAllocCanal Public

'EDIT : utiliser <= pour la dernière entrée du tableau
If FTAC <= UBound(TabAllocCanal) Then
'affectation d'un nouveau numero de canal dans
'le TabAllocCanal
TabAllocCanal(FTAC).nom = PathName
TabAllocCanal(FTAC).numero = FreeFile
'Incrémentation de FTAC
FTAC = FTAC + 1
'Resultat
Debug.Print FTAC
AllocCanal = FTAC
Else
'Le tableau est plein
MsgBox "Saturation"
Exit Function
End If

End Function



'===================================================== ' RechercheAllocCanal
'===================================================== 'Desc: Retourne le numero de canal associé au fichier
'
'
'
'Entrée : String : FilePathName
'Sortie : Integer : numéro de canal
'
'==================================================== Function RechercheAllocCanal(FilePathName As String) As Integer
Dim i As Integer

'EDIT: un tableau peut commencer à 0
i = LBound(TabAllocCanal)
'Retrouve le numero de canal associé au fichier

'EDIT : si non associé avant : erreur de dépassement du tableau
'Attention s'il n a pas été associé avt => boucle infinie

Do While TabAllocCanal(i).nom <> FilePathName And i <= FTAC
i = i + 1
Loop

Debug.Print TabAllocCanal(i).nom
Debug.Print TabAllocCanal(i).numero
RechercheAllocCanal = TabAllocCanal(i).numero

End Function

Function Lire(FilePathName As String, Tampon As String, Optional OctetDébut
As Integer = 1) As String
Get RechercheAllocCanal(FilePathName), OctetDébut, Tampon
Lire = Tampon
End Function

Private Sub Form_Load()
Dim FFN As Integer, strBuffer As String
FFN = AllocCanal("c:test.txt")

Open "c:test.txt" For Binary As FFN
strBuffer = String$(LOF(FFN), vbNullChar)
MsgBox Lire("c:test.txt", strBuffer)
Close FFN
End Sub


--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:407bfea8$0$22864$
Avatar
Zeg
Merci beaucoup, j'ai reussi à me débrouiller :)

Est ce utopique de vouloir gerer les n° canaux sans utiliser FreeFile?
FreeFile attribue t elle les numeros de façon sequentielles?

ng: Je souhaitais faire une lecture independament de l'ouverture du fichier,
c pour mettre ds une classe.
Qu'est ce que tu entend par:
"On pourrait également directement travailler avec Lire (en tant que
variable) à la place de Buff."

François:
Est ce que tu veux dire que <= UBound(TabAllocCanal) teste le dernier
indice affecté du tableau??
d'autre part :
strBuffer = String$(LOF(FFN), vbNullChar)

ça construit une chaine de caracteres de 0 de la taille de mon fichier si
j'ai bien suivi?

TIA

"Zeg" a écrit dans le message de news:
407bfea8$0$22864$
Salut,
Je tente d'ecrire dans un fichier binaire à l'aide de fonctions que j'ai
défini, qui gere le numero de canal:

Rem ===================================================== > Rem AllocCanal
Rem ===================================================== > Rem Desc: Retourne un numero de canal libre pour pouvoir l'associé a un
fichier
Rem attibué séquentiellemnent parmis le tableau global tabAllocCanal
Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== > Function AllocCanal(PathName As String) As Integer
Rem Essaie d'Allocation d'un nouveau numero de canal par
affectation d'un indice supp au TabAllocCanal Public
If FTAC < UBound(TabAllocCanal) Then
Rem affectation d'un nouveau numero de canal


dans
le tabAllocCanal
TabAllocCanal(FTAC).nom = PathName
TabAllocCanal(FTAC).numero = FTAC
Rem Incrémentation de FTAC
FTAC = FTAC + 1
Rem Resultat
Debug.Print FTAC
AllocCanal = FTAC
Else
Rem Le tableau est plein
MsgBox "Saturation"
Exit Function
End If

End Function



Rem ===================================================== > Rem RechercheAllocCanal
Rem ===================================================== > Rem Desc: Retourne le numero de canal associé au fichier
Rem
Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== > Function RechercheAllocCanal(FilePathName As String) As Integer
Dim i As Integer
i = 1
Rem Retrouve le numero de canal associé au fichier
Rem Attention s'il n a pas été associé avt => boucle infinie
Do While TabAllocCanal(i).nom <> FilePathName And i < FTAC
i = i + 1
Loop
Debug.Print TabAllocCanal(i).nom
Debug.Print TabAllocCanal(i).numero
RechercheAllocCanal = TabAllocCanal(i).numero

End Function

Et j'ai une erreur sur la ligne *, le msg d'erreur est "nom ou numero de
fichier incorrect" pourtant le numero semble être le bon!!

Function Lire(FilePathName As String, Tampon As String, Optional


OctetDébut
As Integer = 1) As String
*Get RechercheAllocCanal(FilePathName), OctetDébut, Tampon
Lire = Tampon
End Function

Merci d'avance pour votre aide, j' ai dejà passer plusieurs heures (genre
beaucoup trop pr ça) ;)




Avatar
François Picalausa
Hello,


ng: Je souhaitais faire une lecture independament de l'ouverture du


fichier,
c pour mettre ds une classe.
Qu'est ce que tu entend par:
"On pourrait également directement travailler avec Lire (en tant que
variable) à la place de Buff."



dans le code qu'il propose:
Function Lire(FilePathName As String, Optional OctetDebut As Integer = 1) As
String
Dim k as integer, sBuff as string
k= freefile
open FilePathName For Binary as #k
sBuff = Space$(LOF(k))
Get #k, OctetDebut, sBuff
Close #k
Lire = sBuff:sBuff=""
End Function

On peut remplacer sBuff par Lire.
=>
Function Lire(FilePathName As String, Optional OctetDebut As Integer = 1) As
String
Dim k as integer
k= freefile
open FilePathName For Binary as #k
Lire = Space$(LOF(k))
Get #k, OctetDebut, Lire
Close #k
End Function

Est ce que tu veux dire que <= UBound(TabAllocCanal) teste le dernier
indice affecté du tableau??


Simplement qu'avec < UBound(TabAllocCanal), tu oublie le dernier élément du
tableau, si celui ci est dimensionné à partir de zéro.. j'aurais du le
préciser.
Pour bien faire:
If FTAC <= (UBound(TabAllocCanal)-LBound(TabAllocCanal) Then
De cette manière, on ne retourne pas Saturation s'il y a encore une place
restante.
(Note que généralement, on utilise des tableaux dimensionnés à partir de
zéro

strBuffer = String$(LOF(FFN), vbNullChar)

ça construit une chaine de caracteres de 0 de la taille de mon fichier si
j'ai bien suivi?



Pas de zéros ("0") mais de nullchars (chr$(0), qui ne sont pas
représentables, mais qui sont le premier élément de la table ascii)
Note que tu pourrais aussi utiliser "a", " " ou autre valeur. Mais j'avais
pu testé à l'époque que le remplissage par des nullchars allait plus vite
(peut-être une erreur dans ce bench là d'ailleurs...)

Est ce utopique de vouloir gerer les n° canaux sans utiliser FreeFile?



Pas utopique, déconseillé, surtout dans une classe

FreeFile attribue t elle les numeros de façon sequentielles?



De manière a ne pas en avoir en double certainement.
Suppose que l'utilisateur de ta classe ouvre un fichier avec le numéro 1
"normalement", et fasse ensuite appel à ta classe sans freefile, il y aura
conflit parce que ta classe voudra utiliser 1
Pour la même situations avec freefile, tout est OK

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net
"Zeg" a écrit dans le message de
news:407c2f48$0$22877$
Merci beaucoup, j'ai reussi à me débrouiller :)

Est ce utopique de vouloir gerer les n° canaux sans utiliser FreeFile?
FreeFile attribue t elle les numeros de façon sequentielles?

ng: Je souhaitais faire une lecture independament de l'ouverture du


fichier,
c pour mettre ds une classe.
Qu'est ce que tu entend par:
"On pourrait également directement travailler avec Lire (en tant que
variable) à la place de Buff."

François:
Est ce que tu veux dire que <= UBound(TabAllocCanal) teste le dernier
indice affecté du tableau??
d'autre part :
strBuffer = String$(LOF(FFN), vbNullChar)

ça construit une chaine de caracteres de 0 de la taille de mon fichier si
j'ai bien suivi?

TIA

"Zeg" a écrit dans le message de news:
407bfea8$0$22864$
> Salut,
> Je tente d'ecrire dans un fichier binaire à l'aide de fonctions que j'ai
> défini, qui gere le numero de canal:
>
> Rem ===================================================== > > Rem AllocCanal
> Rem ===================================================== > > Rem Desc: Retourne un numero de canal libre pour pouvoir l'associé a un
> fichier
> Rem attibué séquentiellemnent parmis le tableau global


tabAllocCanal
> Rem
> Rem
> Rem Entrée : String : FilePathName
> Rem Sortie : Integer : numéro de canal
> Rem
> Rem ==================================================== > > Function AllocCanal(PathName As String) As Integer
> Rem Essaie d'Allocation d'un nouveau numero de canal par
> affectation d'un indice supp au TabAllocCanal Public
> If FTAC < UBound(TabAllocCanal) Then
> Rem affectation d'un nouveau numero de canal
dans
> le tabAllocCanal
> TabAllocCanal(FTAC).nom = PathName
> TabAllocCanal(FTAC).numero = FTAC
> Rem Incrémentation de FTAC
> FTAC = FTAC + 1
> Rem Resultat
> Debug.Print FTAC
> AllocCanal = FTAC
> Else
> Rem Le tableau est plein
> MsgBox "Saturation"
> Exit Function
> End If
>
> End Function
>
>
>
> Rem ===================================================== > > Rem RechercheAllocCanal
> Rem ===================================================== > > Rem Desc: Retourne le numero de canal associé au fichier
> Rem
> Rem
> Rem
> Rem Entrée : String : FilePathName
> Rem Sortie : Integer : numéro de canal
> Rem
> Rem ==================================================== > > Function RechercheAllocCanal(FilePathName As String) As Integer
> Dim i As Integer
> i = 1
> Rem Retrouve le numero de canal associé au fichier
> Rem Attention s'il n a pas été associé avt => boucle


infinie
> Do While TabAllocCanal(i).nom <> FilePathName And i < > FTAC
> i = i + 1
> Loop
> Debug.Print TabAllocCanal(i).nom
> Debug.Print TabAllocCanal(i).numero
> RechercheAllocCanal = TabAllocCanal(i).numero
>
> End Function
>
> Et j'ai une erreur sur la ligne *, le msg d'erreur est "nom ou numero de
> fichier incorrect" pourtant le numero semble être le bon!!
>
> Function Lire(FilePathName As String, Tampon As String, Optional
OctetDébut
> As Integer = 1) As String
> *Get RechercheAllocCanal(FilePathName), OctetDébut, Tampon
> Lire = Tampon
> End Function
>
> Merci d'avance pour votre aide, j' ai dejà passer plusieurs heures


(genre
> beaucoup trop pr ça) ;)
>
>




Avatar
ng
Salut,

Est ce utopique de vouloir gerer les n° canaux sans utiliser FreeFile?


Quel interet ?
De plus il se pourrait qu'une erreur de fermeture se produise et ta fonction
te renverait un numéro deja utilisé !



Function Lire(FilePathName As String, intNbOctetsALire as Integer, Optional
OctetDebut As Integer = 1) As String
Dim k as integer, sBuff as string
sBuff = Space$(intNbOctetsALire)
k= freefile
open FilePathName For Binary as #k
Get #k, OctetDebut, sBuff
Close #k
Lire = sBuff:sBuff=""
End Function


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Zeg a écrit :

Merci beaucoup, j'ai reussi à me débrouiller :)

Est ce utopique de vouloir gerer les n° canaux sans utiliser FreeFile?
FreeFile attribue t elle les numeros de façon sequentielles?

ng: Je souhaitais faire une lecture independament de l'ouverture du
fichier, c pour mettre ds une classe.
Qu'est ce que tu entend par:
"On pourrait également directement travailler avec Lire (en tant
que variable) à la place de Buff."

François:
Est ce que tu veux dire que <= UBound(TabAllocCanal) teste le
dernier indice affecté du tableau??
d'autre part :
strBuffer = String$(LOF(FFN), vbNullChar)

ça construit une chaine de caracteres de 0 de la taille de mon
fichier si j'ai bien suivi?

TIA

"Zeg" a écrit dans le message de news:
407bfea8$0$22864$
Salut,
Je tente d'ecrire dans un fichier binaire à l'aide de fonctions que
j'ai défini, qui gere le numero de canal:

Rem ===================================================== >> Rem AllocCanal
Rem ===================================================== >> Rem Desc: Retourne un numero de canal libre pour pouvoir l'associé a
un fichier
Rem attibué séquentiellemnent parmis le tableau global
tabAllocCanal Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== >> Function AllocCanal(PathName As String) As Integer
Rem Essaie d'Allocation d'un nouveau numero de canal par
affectation d'un indice supp au TabAllocCanal Public
If FTAC < UBound(TabAllocCanal) Then
Rem affectation d'un nouveau numero de
canal dans le tabAllocCanal
TabAllocCanal(FTAC).nom = PathName
TabAllocCanal(FTAC).numero = FTAC
Rem Incrémentation de FTAC
FTAC = FTAC + 1
Rem Resultat
Debug.Print FTAC
AllocCanal = FTAC
Else
Rem Le tableau est plein
MsgBox "Saturation"
Exit Function
End If

End Function



Rem ===================================================== >> Rem RechercheAllocCanal
Rem ===================================================== >> Rem Desc: Retourne le numero de canal associé au fichier
Rem
Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== >> Function RechercheAllocCanal(FilePathName As String) As Integer
Dim i As Integer
i = 1
Rem Retrouve le numero de canal associé au fichier
Rem Attention s'il n a pas été associé avt => boucle
infinie Do While TabAllocCanal(i).nom <>
FilePathName And i <= FTAC i = i + 1
Loop
Debug.Print TabAllocCanal(i).nom
Debug.Print TabAllocCanal(i).numero
RechercheAllocCanal = TabAllocCanal(i).numero

End Function

Et j'ai une erreur sur la ligne *, le msg d'erreur est "nom ou
numero de fichier incorrect" pourtant le numero semble être le bon!!

Function Lire(FilePathName As String, Tampon As String, Optional
OctetDébut As Integer = 1) As String
*Get RechercheAllocCanal(FilePathName), OctetDébut,
Tampon Lire = Tampon
End Function

Merci d'avance pour votre aide, j' ai dejà passer plusieurs heures
(genre beaucoup trop pr ça) ;)




Avatar
ng
Arf je sais pas ce qu'il s'est passé mais le message est parti tout seul :/
enfin bref j'ai vu que Francois avait tout bien répondu donc pas besoin de
finir mon message :)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

ng a écrit :

Salut,

Est ce utopique de vouloir gerer les n° canaux sans utiliser
FreeFile?


Quel interet ?
De plus il se pourrait qu'une erreur de fermeture se produise et ta
fonction te renverait un numéro deja utilisé !



Function Lire(FilePathName As String, intNbOctetsALire as Integer,
Optional OctetDebut As Integer = 1) As String
Dim k as integer, sBuff as string
sBuff = Space$(intNbOctetsALire)
k= freefile
open FilePathName For Binary as #k
Get #k, OctetDebut, sBuff
Close #k
Lire = sBuff:sBuff=""
End Function



Merci beaucoup, j'ai reussi à me débrouiller :)

Est ce utopique de vouloir gerer les n° canaux sans utiliser
FreeFile? FreeFile attribue t elle les numeros de façon
sequentielles?

ng: Je souhaitais faire une lecture independament de l'ouverture du
fichier, c pour mettre ds une classe.
Qu'est ce que tu entend par:
"On pourrait également directement travailler avec Lire (en tant
que variable) à la place de Buff."

François:
Est ce que tu veux dire que <= UBound(TabAllocCanal) teste le
dernier indice affecté du tableau??
d'autre part :
strBuffer = String$(LOF(FFN), vbNullChar)

ça construit une chaine de caracteres de 0 de la taille de mon
fichier si j'ai bien suivi?

TIA

"Zeg" a écrit dans le message de news:
407bfea8$0$22864$
Salut,
Je tente d'ecrire dans un fichier binaire à l'aide de fonctions que
j'ai défini, qui gere le numero de canal:

Rem ===================================================== >>> Rem AllocCanal
Rem ===================================================== >>> Rem Desc: Retourne un numero de canal libre pour pouvoir l'associé a
un fichier
Rem attibué séquentiellemnent parmis le tableau global
tabAllocCanal Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== >>> Function AllocCanal(PathName As String) As Integer
Rem Essaie d'Allocation d'un nouveau numero de canal
par affectation d'un indice supp au TabAllocCanal Public
If FTAC < UBound(TabAllocCanal) Then
Rem affectation d'un nouveau numero de
canal dans le tabAllocCanal
TabAllocCanal(FTAC).nom = PathName
TabAllocCanal(FTAC).numero = FTAC
Rem Incrémentation de FTAC
FTAC = FTAC + 1
Rem Resultat
Debug.Print FTAC
AllocCanal = FTAC
Else
Rem Le tableau est plein
MsgBox "Saturation"
Exit Function
End If

End Function



Rem ===================================================== >>> Rem RechercheAllocCanal
Rem ===================================================== >>> Rem Desc: Retourne le numero de canal associé au fichier
Rem
Rem
Rem
Rem Entrée : String : FilePathName
Rem Sortie : Integer : numéro de canal
Rem
Rem ==================================================== >>> Function RechercheAllocCanal(FilePathName As String) As Integer
Dim i As Integer
i = 1
Rem Retrouve le numero de canal associé au fichier
Rem Attention s'il n a pas été associé avt => boucle
infinie Do While TabAllocCanal(i).nom <>
FilePathName And i <= FTAC i = i + 1
Loop
Debug.Print TabAllocCanal(i).nom
Debug.Print TabAllocCanal(i).numero
RechercheAllocCanal = TabAllocCanal(i).numero

End Function

Et j'ai une erreur sur la ligne *, le msg d'erreur est "nom ou
numero de fichier incorrect" pourtant le numero semble être le bon!!

Function Lire(FilePathName As String, Tampon As String, Optional
OctetDébut As Integer = 1) As String
*Get RechercheAllocCanal(FilePathName), OctetDébut,
Tampon Lire = Tampon
End Function

Merci d'avance pour votre aide, j' ai dejà passer plusieurs heures
(genre beaucoup trop pr ça) ;)






Avatar
Zeg
Une info dont je viens de me rappeler et qui finalement était la raison de
mes soucis,
c'est que toutes les opérations sur les fichiers doivent être dans le même
module.
confirmez moi

En fait j'ai une classe de gestion de fichier binaire, qui alloue les numero
de canaux, entre autre, et stocke dans une table tous mes fichiers ouverts
avec leur numero de canaux. Je vais implementer une insertion dichotomique
pour rechercher les fichiers par leur nom .




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

Arf je sais pas ce qu'il s'est passé mais le message est parti tout seul


:/
enfin bref j'ai vu que Francois avait tout bien répondu donc pas besoin de
finir mon message :)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

ng a écrit :

> Salut,
>
>> Est ce utopique de vouloir gerer les n° canaux sans utiliser
>> FreeFile?
> Quel interet ?
> De plus il se pourrait qu'une erreur de fermeture se produise et ta
> fonction te renverait un numéro deja utilisé !
>
>
>
> Function Lire(FilePathName As String, intNbOctetsALire as Integer,
> Optional OctetDebut As Integer = 1) As String
> Dim k as integer, sBuff as string
> sBuff = Space$(intNbOctetsALire)
> k= freefile
> open FilePathName For Binary as #k
> Get #k, OctetDebut, sBuff
> Close #k
> Lire = sBuff:sBuff=""
> End Function
>
>
>
>> Merci beaucoup, j'ai reussi à me débrouiller :)
>>
>> Est ce utopique de vouloir gerer les n° canaux sans utiliser
>> FreeFile? FreeFile attribue t elle les numeros de façon
>> sequentielles?
>>
>> ng: Je souhaitais faire une lecture independament de l'ouverture du
>> fichier, c pour mettre ds une classe.
>> Qu'est ce que tu entend par:
>> "On pourrait également directement travailler avec Lire (en tant
>> que variable) à la place de Buff."
>>
>> François:
>> Est ce que tu veux dire que <= UBound(TabAllocCanal) teste le
>> dernier indice affecté du tableau??
>> d'autre part :
>> strBuffer = String$(LOF(FFN), vbNullChar)
>>
>> ça construit une chaine de caracteres de 0 de la taille de mon
>> fichier si j'ai bien suivi?
>>
>> TIA
>>
>> "Zeg" a écrit dans le message de news:
>> 407bfea8$0$22864$
>>> Salut,
>>> Je tente d'ecrire dans un fichier binaire à l'aide de fonctions que
>>> j'ai défini, qui gere le numero de canal:
>>>
>>> Rem ===================================================== > >>> Rem AllocCanal
>>> Rem ===================================================== > >>> Rem Desc: Retourne un numero de canal libre pour pouvoir l'associé a
>>> un fichier
>>> Rem attibué séquentiellemnent parmis le tableau global
>>> tabAllocCanal Rem
>>> Rem
>>> Rem Entrée : String : FilePathName
>>> Rem Sortie : Integer : numéro de canal
>>> Rem
>>> Rem ==================================================== > >>> Function AllocCanal(PathName As String) As Integer
>>> Rem Essaie d'Allocation d'un nouveau numero de canal
>>> par affectation d'un indice supp au TabAllocCanal Public
>>> If FTAC < UBound(TabAllocCanal) Then
>>> Rem affectation d'un nouveau numero de
>>> canal dans le tabAllocCanal
>>> TabAllocCanal(FTAC).nom = PathName
>>> TabAllocCanal(FTAC).numero = FTAC
>>> Rem Incrémentation de FTAC
>>> FTAC = FTAC + 1
>>> Rem Resultat
>>> Debug.Print FTAC
>>> AllocCanal = FTAC
>>> Else
>>> Rem Le tableau est plein
>>> MsgBox "Saturation"
>>> Exit Function
>>> End If
>>>
>>> End Function
>>>
>>>
>>>
>>> Rem ===================================================== > >>> Rem RechercheAllocCanal
>>> Rem ===================================================== > >>> Rem Desc: Retourne le numero de canal associé au fichier
>>> Rem
>>> Rem
>>> Rem
>>> Rem Entrée : String : FilePathName
>>> Rem Sortie : Integer : numéro de canal
>>> Rem
>>> Rem ==================================================== > >>> Function RechercheAllocCanal(FilePathName As String) As Integer
>>> Dim i As Integer
>>> i = 1
>>> Rem Retrouve le numero de canal associé au fichier
>>> Rem Attention s'il n a pas été associé avt => boucle
>>> infinie Do While TabAllocCanal(i).nom <>
>>> FilePathName And i <= FTAC i = i + 1
>>> Loop
>>> Debug.Print TabAllocCanal(i).nom
>>> Debug.Print TabAllocCanal(i).numero
>>> RechercheAllocCanal = TabAllocCanal(i).numero
>>>
>>> End Function
>>>
>>> Et j'ai une erreur sur la ligne *, le msg d'erreur est "nom ou
>>> numero de fichier incorrect" pourtant le numero semble être le bon!!
>>>
>>> Function Lire(FilePathName As String, Tampon As String, Optional
>>> OctetDébut As Integer = 1) As String
>>> *Get RechercheAllocCanal(FilePathName), OctetDébut,
>>> Tampon Lire = Tampon
>>> End Function
>>>
>>> Merci d'avance pour votre aide, j' ai dejà passer plusieurs heures
>>> (genre beaucoup trop pr ça) ;)




Avatar
François Picalausa
Hello!

A condition de considérer que tout les modules, forms, classes, autres ne
font qu'un module, c'est exact...
Sinon, on peut très bien commencer une écriture dans un form, la continuer
dans un module, et en commencer/finir une autre dans une classe tout à fait
à part!

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:407feb92$0$503$
Une info dont je viens de me rappeler et qui finalement était la
raison de mes soucis,
c'est que toutes les opérations sur les fichiers doivent être dans le
même module.
confirmez moi


Avatar
Zeg
Quelle type de données peut on écrire dans un fichier Binaire ?
car pour l'instant je ne travailles qu'avec des string,
mais l'idéal serait de pouvoir ecrire des records.
La MSDN dit :
Put [#]filenumber, [recnumber], varname

Get [#]filenumber, [recnumber], varname

avec varname Nom de la variable contenant les données à écrire sur le
disque.

Lorsque j'essaye d'ecrire un enregistrement à partir de la form, le compilo
me dit :
"Seul les types définis par l'utilisateur et qui st définis dans les modules
d'objets publics peuvent être convertis depuis ou vers un variant, ou passé
à des fonctions à liaison tardives".

Ce qui signifie que c'est uniquement si j'ai un module de classe Objet (avec
Get, Let...) contenant ma fonction Public que je pourrais lui passer en
argument un type prédefinis?

J'avoue que j'ai du mal à capter clairement comment fonctionne la visibilité
en VB avec tous ces .bas, .cls .form, reférencement, global Multiuse. ...


"François Picalausa" a écrit dans le message de news:

Hello!

A condition de considérer que tout les modules, forms, classes, autres ne
font qu'un module, c'est exact...
Sinon, on peut très bien commencer une écriture dans un form, la continuer
dans un module, et en commencer/finir une autre dans une classe tout à


fait
à part!

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:407feb92$0$503$
> Une info dont je viens de me rappeler et qui finalement était la
> raison de mes soucis,
> c'est que toutes les opérations sur les fichiers doivent être dans le
> même module.
> confirmez moi