Page 1 sur 1

Lecture de fichier en mémoire

Publié : jeu. 12/févr./2004 15:25
par Chris
Salut :)

Je me suis amusé à faire un petit exemple qui lit un fichier en mémoire et qui affiche chaque ligne.
Et en plus, il crée son fichier texte lui-même pour que vous n'alliez pas en chercher un ailleurs!!!

Elle est pas belle, la vie :?: :?: :lol:

PS : Si quelqu'un peut répondre à la question, au début du code ;)

Code : Tout sélectionner

#NewFile = 0
#LineMax = 50  ; <-- Maximum, 520 chez moi : Et vous ???
#CharMax = 20  ; <-- Maximum, 100 chez moi : Et vous ???

; En mettant le maximum en nbre de caractères et en nbres de lignes,
; ça me donne une taille de 64 Ko sur le disque (65536 octets).

; Est-ce que c'est la limite pour lire un fichier en mémoire???

;- Message
NoMsg$ = "Il n'y a pas de fichier à lire. !"
Var$ = Chr(34)+"NewFile"+Chr(34)
L1$ = "Créez d'abord un fichier en mettant la variable "+Var$+" à 1."+Chr(10)
L2$ = "Lancez ensuite le programme pour créer un nouveau fichier"+Chr(10)+Chr(10)
L3$ = "Mettez ensuite la variable "+Var$+" à 0 pour lire le fichier"+Chr(10)
L4$ = "Vous pourrez créer un nouveau fichier quand vous le voudrez"+Chr(10)
L5$ = "en mettant de nouveau la variable "+Var$+" à 1"+Chr(10)+Chr(10)
L6$ = "Chris ;o)"
Message$ = L1$+L2$+L3$+L4$+L5$+L6$

;- Création du fichier
;/ Cette partie crée un petit fichier texte composé de
;/ caractères aléatoires. (Les lettres en majuscules)
;/ #LineMax est le nombre maxi de lignes que vous voulez mettre dans le fichier.
;/ #CharMax est le nombre maxi de caractères par ligne.
;/ Si #NewFile est à 1, crée un nouveau fichier.

If #NewFile = 1
  If CreateFile(0,"Random.txt")
    For Line = 0 To #LineMax
      Ligne$ = ""
      For Char = 1 To #CharMax
        idx = Random(25) : idx + 65
        Ligne$ + Chr(idx)
      Next Char
      Ligne$ = "Ligne " + Str(Line) + " = " + Ligne$ + " ---> Fin"
      WriteStringN(Ligne$)
    Next Line
    CloseFile(0)
  EndIf
EndIf

;- Chargement du fichier en mémoire
Fichier$ = "Random.txt"                     ; Initialisations
LenFile.l = FileSize(Fichier$)              ; Longueur du fichier

If ReadFile(0,Fichier$)                     ; Si on peut ouvrir le fichier
  If AllocateMemory(0,LenFile,0)            ; on réserve une zone mémoire
    *Pointer = MemoryID()                   ; on crée un pointeur sur son adresse
    ReadData(*Pointer,LenFile)              ; on charge le fichier en mémoire
  EndIf
  CloseFile(0)                              ; et on le referme
Else
  MessageRequester(NoMsg$,Message$,#PB_MessageRequester_Ok|#MB_ICONSTOP)
  End
EndIf

;- Lecture des données depuis la mémoire
start = 1 : pos = 0                         ; Initialisations
RetChar$ = Chr(13) + Chr(10)                ; Retour chariot

tmp$ = PeekS(*Pointer,LenFile)              ; Chargement du fichier dans un string
Repeat
  pos = FindString(tmp$,RetChar$,start)     ; recherche du retour chariot
  g$ = Mid(tmp$,start,pos-start)            ; récupération de la ligne
  start = pos + 2                           ; mise à jour des variables
  If g$ <> ""                               ; Si la ligne n'est pas vide
    Debug g$                                ; on l'affiche
  EndIf
Until pos = 0;                              ; jusqu'à a fin du fichier
Chris 8)

Publié : jeu. 12/févr./2004 21:01
par filperj
#NewFile = 0
#LineMax = 50 ; <-- Maximum, 520 chez moi : Et vous ???
#CharMax = 20 ; <-- Maximum, 100 chez moi : Et vous ???
c'est qd tu le copie dans une chaine que ça plante, à cause de la fameuse limite des 64Ko . Il faudrait le laisser dans le bloc mémoire où tu le charge en premier.

Publié : jeu. 12/févr./2004 21:23
par Chris
Ah d'accord ! :wink:

Mais alors, si le fichier fait plus de 64 Ko, comment on fait pour travailler dessus :?:

Il faut le charger dans la chaine par morceaux :?:

Chris :)

Publié : jeu. 12/févr./2004 21:33
par filperj
Oui, où alors tu bricoles tes procédures pour le gérer dans le bloc mémoire...
Et tu n'avais pas parlé d'un système de listes liées ? Ou je confond ?
(qu'est-ce que je suis doué pour donner du bouleau aux autres)

Publié : jeu. 12/févr./2004 21:37
par Chris
Et tu n'avais pas parlé d'un système de listes liées ? Ou je confond ?
Ou tu confonds, ou c'est moi qui ne me souviens pas.

A mon avis, c'est la première hypothèse qui est la bonne. :lol:

Chris :)

Publié : jeu. 12/févr./2004 21:49
par filperj
Citation:
Et tu n'avais pas parlé d'un système de listes liées ? Ou je confond ?


Ou tu confonds, ou c'est moi qui ne me souviens pas.

A mon avis, c'est la première hypothèse qui est la bonne.

Chris
Ah bon, mais quelqu'un (un certain Chaipuki) avait parlé chaipuou de mettre un fichier texte dans une liste liée , chaque ligne étant un élément de la liste.
Ca m'avait paru une bonne idée, ça devrai permettre de travailler sur une ligne indépendamment des autre, de supprimer/insérer des lignes...
Si ça se trouve , le blocnote fait comme ça! :lol:

Publié : jeu. 12/févr./2004 22:00
par Chris
Chaipuki
Chaipuou
Chaipukan
Chaipukoman
Chaipukoi
...
...
Chaipurien :oops:

Chris :)

Publié : jeu. 12/févr./2004 22:15
par filperj
:silly:

Publié : jeu. 12/févr./2004 22:38
par filperj
J'ai pas essayé, mais en passant par une LinkedList, ca devrait fonctionner aussi.

L'avantage, c'est qu'on doit pouvoir charger le fichier dans la liste, travailler dans la liste, et ne mettre à jour le fichier qu'à la fermeture.

Ca devrait également permettre de faire des routines plus rapides, puisqu'il y a moins d'accès au disque.
Et tu sais qui avait posté ça ? Hmm ? Réfléchis bien... :twisted:

Publié : jeu. 12/févr./2004 23:01
par Chris
Euuuhhhh!!!

Ben oui... effectivement... :oops: :lol:

Chris :)