Problème lecture fichier

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Problème lecture fichier

Message 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.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Problème lecture fichier

Message 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.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Problème lecture fichier

Message 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
Dernière modification par kernadec le mer. 12/nov./2014 23:29, modifié 1 fois.
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Problème lecture fichier

Message 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.
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Problème lecture fichier

Message 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 !
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Problème lecture fichier

Message par majikeyric »

...
Dernière modification par majikeyric le mer. 12/nov./2014 23:42, modifié 2 fois.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Problème lecture fichier

Message 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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Problème lecture fichier

Message 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?
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Problème lecture fichier

Message par kernadec »

bonjour Ollivier
maintenant avec le recul, j'ai probablement glissé sur une peau de banane :mrgreen:

Cordialement
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Problème lecture fichier

Message 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 ?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème lecture fichier

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème lecture fichier

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Problème lecture fichier

Message par Lord Nelson »

Je vous remercie :)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Problème lecture fichier

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre