Page 1 sur 1
ReadMemory et Chaines
Publié : ven. 20/mars/2009 1:03
par Progi1984
Slt à tous,
Je stocke un fichier (pour être précis un code assembleur donc avec des retours à la ligne) en mémoire.
Quelqu'un aurait une fonction ou une piste pour lire ligne à ligne ce code mais dans la zone mémoire stockée de manière optimisée ? Je ne sais pas si vous me comprenez.
Ce serait je pense plus rapide que des stringfield sur une chaîne ?
Merci d'avance
Publié : ven. 20/mars/2009 9:10
par case
il y a peeks pour lire une string en mémoire, seul problème il faut que ce soit terminé par un chr(0) or si tu charge un fichier texte il y a des chances pour que la fin de ligne ne soit pas terminée de cette manière
ensuite tu peux faire une boucle qui lis chaque octet et renvoi la chaine lorsqu'elle rencontre un caractère de fin de ligne...
enfin tu peux aussi lire directement le fichier ligne par ligne avec des readstring()
tout depend de ce que tu veux faire
Publié : ven. 20/mars/2009 9:44
par Progi1984
case a écrit :il y a peeks pour lire une string en mémoire, seul problème il faut que ce soit terminé par un chr(0) or si tu charge un fichier texte il y a des chances pour que la fin de ligne ne soit pas terminée de cette manière
ensuite tu peux faire une boucle qui lis chaque octet et renvoi la chaine lorsqu'elle rencontre un caractère de fin de ligne...
enfin tu peux aussi lire directement le fichier ligne par ligne avec des readstring()
tout depend de ce que tu veux faire
Une fin de ligne se termine en fonction du système par chr(13) ou chr(10) ou chr(13) & chr(10).
Je cherche la manière la plus optimisée et la plus rapide.
Publié : ven. 20/mars/2009 14:59
par gnozal
Un exemple :
Code : Tout sélectionner
;
; Read Text Lines From Memory Buffer
;
Procedure.s ReadLineInMem(*MemBufferFirstTime = 0, MemBufferLenFirstTime = 0) ; Read line from buffer [returns CHR(1) if end of buffer]
Protected Length, *pt.Byte, *endPt, *strPt.Byte
Static MemFileOffset, *MemBuffer, MemBufferLen
If *MemBufferFirstTime And MemBufferLenFirstTime
*MemBuffer = *MemBufferFirstTime
MemBufferLen = MemBufferLenFirstTime
MemFileOffset = 0
EndIf
If *MemBuffer And MemBufferLen
*pt = *MemBuffer + MemFileOffset
*endPt = *MemBuffer + MemBufferLen
*strPt = *pt
If MemFileOffset < MemBufferLen
While *pt < *endPt
c = *pt\b
*pt = *pt + 1
If c = 13
Break
EndIf
If c = 10
Break
EndIf
Length = Length + 1
Wend
If *pt < *endPt
n = *pt\b
If n + c = 23
*pt = *pt + 1
EndIf
EndIf
MemFileOffset = *pt - *MemBuffer
ProcedureReturn PeekS(*strPt, Length)
Else
ProcedureReturn Chr(1)
EndIf
Else
ProcedureReturn Chr(1)
EndIf
EndProcedure
;
Stream = ReadFile(#PB_Any, #PB_Compiler_Home + "Examples\Sources - Advanced\Waponez II\Waponez II.pb")
If Stream
MemBufferLen = Lof(Stream)
If MemBufferLen
*MemBuffer = AllocateMemory(Lof(Stream))
If *MemBuffer
If ReadData(Stream, *MemBuffer, MemBufferLen) = MemBufferLen
;
; Read lines from *MemBuffer
;
Line.s = ReadLineInMem(*MemBuffer, MemBufferLen)
While Line <> Chr(1)
Debug Line
Line = ReadLineInMem()
Wend
;
;
;
EndIf
FreeMemory(*MemBuffer)
EndIf
EndIf
CloseFile(Stream)
EndIf
Vieux code PB3.94 adapté (rapidement) à PB4.30. A modifier si on veut faire de l'unicode...
Fonctionne avec #Cr$, #Lf$ ou #CrLf$ comme retour à la ligne.
Publié : lun. 23/mars/2009 13:45
par Progi1984
Désolé, j'étais absent ce week-end et .
Je regarde cela ce soir.
Merci gnozal pour le code.