Lecture de fichier en mémoire

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Lecture de fichier en mémoire

Message 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)
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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.
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :)
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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)
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :)
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Chaipuki
Chaipuou
Chaipukan
Chaipukoman
Chaipukoi
...
...
Chaipurien :oops:

Chris :)
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

:silly:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Euuuhhhh!!!

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

Chris :)
Répondre