ReadMemory et Chaines

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

ReadMemory et Chaines

Message 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
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message 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
ImageImage
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Désolé, j'étais absent ce week-end et .

Je regarde cela ce soir.
Merci gnozal pour le code.
Répondre