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.