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
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
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

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
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
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.

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.