Page 1 sur 1

Problème lecture fichier

Publié : mer. 12/nov./2014 22:21
par Lord Nelson
Bonsoir,

J'ai un problème avec se code:

Code : Tout sélectionner

OpenFile(0, "TestXXX.txt")

For k = 1 To 100
  For i = 0 To 255
    WriteByte(0, i)
  Next
Next

file$ = OpenFileRequester("S�lectionnez un fichier","","Text (.txt)|*.txt|All files (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$) 
      length = Lof(0) ; Lit la taille en octets du fichier 
      *MemoryID = AllocateMemory(length) ; alloue un bloc m�moire de la taille du fichier "length"
      If *MemoryID ; si l'allacation a bien fonctionner ont continue
        ReadData(0, *MemoryID, length)   ; Lit les donn�es du fichier et les place dans le bloc m�moire "*MemoryID" de la taille correspondant � "length"
        *Fichier.String = @*MemoryID ; "*Fichier" a pour valeur l'adresse o� r�side la cha�ne de caract�res en m�moire "*MemoryID"
        Fichier$ = *Fichier\s ; "Fichier$" � pour valeur le texte o� r�side la cha�ne de caract�res en m�moire "*MemoryID"
        Debug Fichier$
      EndIf
      CloseFile(0)
    EndIf
  EndIf
  
C'est un code test qui reproduit l'erreur dans mon programme.
Dans mon programme j'écris des bytes dans un fichier.

Ensuite je lis le fichier mais... ça ne fonctionne pas :?
Tout est bon quand je vérifie mais Fichier$ ne contient rien :|

D’où ça viens d'après vous ?
Se que je voudrais c'est charger le fichier en une fois dans la variable Fichier$, car je dois faire des traitement sur les bytes dans Fichier$.

Ce code fonctionne avec des fichier texte mais pas avec des fichier avec des bytes faut croire.

Re: Problème lecture fichier

Publié : mer. 12/nov./2014 23:00
par Ollivier
C'est compliqué là mais c'est simple...
Si tu écris des octets, il vaudra mieux lire des octets aussi.
Si tu écris des octets, puis que tu lis une chaîne, tu risques un défaut. En fait, tu vas lire une chaîne qui commence au début de ton fichier. Mais elle s'arrêtera un peu n'importe où, et plus précisément là où elle va trouver un code de fin de chaîne (en pb c'est chr(0) ). Résultat (et 2ème inconvénient): tout ce qui se trouve après ce code de fin de chaîne sera ignoré.

Un fichier, c'est comme un message, une lettre: il vaut mieux que celui qui écrit et celui qui lit parlent la même langue.

Donc ta question est "Qu'est-ce je dois enregistrer?"
Les réponses possibles sont:
des chaînes?
des octets?
etc...

Là, la 1ère erreur que je vois c'est que tu enregistres un 1er octet nul. puis un code 1 puis un code 2, etc...

A la lecture du fichier, en lisant à l'aide des chaînes, ben, à peine ça commence qu'il se bouffe un code 0 ( donc une fin de chaîne) donc il considère qu'il a trouvé une chaîne vide.

Re: Problème lecture fichier

Publié : mer. 12/nov./2014 23:16
par kernadec
bonsoir
Lord Nelson cela t'oblige à écrire AllocateMemory(length + 1) dans ton code
pour inclure le caractère de fin de chaine :D

Cordialement

Re: Problème lecture fichier

Publié : mer. 12/nov./2014 23:17
par Lord Nelson
J'avais anticipé ça oui et quand tu fais ReadString, tu à un paramètre pour ignorer les chr(0)
Comme ceci par exemple :):

Code : Tout sélectionner

file$ = OpenFileRequester("S�lectionnez un fichier","","Text (.txt)|*.txt|All files (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$) 
      While Eof(0) = 0 
        Fichier$ + ReadString(0, #PB_Ascii | #PB_File_IgnoreEOL)
      Wend
      CloseFile(0)
    EndIf
  EndIf
Seule inconvenant, c'est énormément long !
Comment faire alors, mettre en mémoire ?
Merci.

Re: Problème lecture fichier

Publié : mer. 12/nov./2014 23:20
par Lord Nelson
kernadec a écrit :bonsoir
Lord Nelson vient de découvrir une coquille de la doc :wink:
Dans l'aide la commande lof() possède cet exemple qui fonctionne pas en PB531
il faut écrire AllocateMemory(length + 1) pour inclure le caractère de fin de chaine

Cordialement
Heu... coquille, comment ça ?
Et même avec ton explication, ça ne fonctionne pas !

Code : Tout sélectionner

file$ = OpenFileRequester("S�lectionnez un fichier","","Text (.txt)|*.txt|All files (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$) 
      length = Lof(0) ; Lit la taille en octets du fichier 
      *MemoryID = AllocateMemory(length + 1) ; alloue un bloc m�moire de la taille du fichier "length"
      If *MemoryID                       ; si l'allacation a bien fonctionner ont continue
        z = ReadData(0, *MemoryID, length)   ; Lit les donn�es du fichier et les place dans le bloc m�moire "*MemoryID" de la taille correspondant � "length"
        *Fichier.String = @*MemoryID     ; "*Fichier" a pour valeur l'adresse o� r�side la cha�ne de caract�res en m�moire "*MemoryID"
        Fichier$ = *Fichier\s           ; "Fichier$" � pour valeur le texte o� r�side la cha�ne de caract�res en m�moire "*MemoryID"
      EndIf
      CloseFile(0)
    EndIf
  EndIf
Ollivier a très bien expliquer le problème.
Ici, c'est qu'un exemple bidon dans le premier code, le vraie code contient des Bytes aléatoire !

Re: Problème lecture fichier

Publié : mer. 12/nov./2014 23:30
par majikeyric
...

Re: Problème lecture fichier

Publié : mer. 12/nov./2014 23:32
par kernadec
non, il n'y a pas de coquille :oops: en essayant de corriger ton code
avec celui de la doc je me suis pris les pieds dans le tapis
l'exemple de la doc est bon :mrgreen:

Cordialement

Re: Problème lecture fichier

Publié : jeu. 13/nov./2014 1:16
par Ollivier
Pfrôhaha... Kernadec... A force d'être sur le fessard pour x raisons, je vais finir par changer d'avatar là...

Mais lequel?

Re: Problème lecture fichier

Publié : jeu. 13/nov./2014 8:36
par kernadec
bonjour Ollivier
maintenant avec le recul, j'ai probablement glissé sur une peau de banane :mrgreen:

Cordialement

Re: Problème lecture fichier

Publié : jeu. 13/nov./2014 11:25
par Lord Nelson
Une petite question svp :)

Si j'écris le Byte 1 dans un fichier et que ensuite je lis le fichier avec ReadString et que je convertie le caractères lut en Asc(), va t-il me donner 1 ?
Se que je veux dire c'est, est-ce que cette méthode est correcte ?

Re: Problème lecture fichier

Publié : jeu. 13/nov./2014 12:01
par falsam
En attendant que tu expliques pourquoi tu souhaites lire des nombres binaires avec la fonction ReadString() je te propose une solution avec ReadByte()

Code : Tout sélectionner

Enumeration
  #File
EndEnumeration

;Création d'un fichier et écriture de 10 nombre binaire = 1
If CreateFile(#File, "myfile.bin")
  For n=0 To 10
    WriteByte(#File, 1)
  Next
  CloseFile(#File)
EndIf

;Lecture des nombres binaires
If OpenFile(#File, "myfile.bin")
  While Eof(#File) = 0 
    Debug ReadByte(#File)
  Wend
EndIf
PS : Ne cherche PAS à lire ce fichier avec un éditeur de texte.

Re: Problème lecture fichier

Publié : jeu. 13/nov./2014 12:09
par falsam
*Fichier.String = @*MemoryID ; "*Fichier" a pour valeur l'adresse o� r�side la cha�ne de caract�res en m�moire "*MemoryID"
Comme tu peux le voir, les accents ne sont pas reconnus.

:idea: Cliques sur le menu fichier -> Format du fichier -> Coche l'item Encoding : Utf8

Re: Problème lecture fichier

Publié : jeu. 13/nov./2014 12:57
par Lord Nelson
Je vous remercie :)

Re: Problème lecture fichier

Publié : jeu. 13/nov./2014 17:06
par Ar-S
En 2014, ce serait pas mal que tout passe en UTF8.. On trouve toujours un site, un document ou autre avec des soucis d'affichage.