cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 2023
-
27 juin 2008 à 15:41
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
28 juin 2008 à 14:16
Bonjour,
Je souhaite pouvoir lire dans un fichier.
Je
veux que la variable prenne la taille des données à lire dans le
fichier, j'ai donc pensé à un Array of Char auquel j'affecte la taille
en question.
Mais voici l'erreur :
Le projet FicEditor.exe a provoqué une classe d'exception EInOutError avec le message 'Lecture au-delà de la fin de fichier'.
Et voici le code :
procedure FEFFormat.ReadFileXML(var Character: String; var Place: String;
var Idea: String; var Fic: String);
begin
BlockRead(F, CRCFile, 4);
BlockRead(F, SizeFile, 4);
FileXML est du type Array of Char.
J'ai tenté avec un Array [1..34] of Char et ça fonctionne sans problème.
donc j'en déduit que le soucis provient du Dynamic Array.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 27 juin 2008 à 17:23
Salut,
Bon, alors il y a un truc bon à savoir avec les tableaux dynamiques et les string, c'est leur structure interne.
En fait, FileXML ne renvoie pas vers le tableau mais vers sa taille ! (celle que tu récupères en faisant Length()- oui je sais c'est pas super évident au premier abord).
Pour faire une lecture correcte, il faut donc indiquer FileXML[0] dans BlockRead().
Après, il faut aussi voir si ta variable SizeFile est bien correcte ou non, et pour le savoir, il faudrait voir le code d'écriture.
A+
Flo
PS: c'est vrai que changer tout son code est gonflant, n'empèche que si tu fais un autre programme, tu essayeras de penser aux TStream et compagnie, ça risque de simplifier la vie. Bon j'arrète avec ça.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 27 juin 2008 à 19:44
Rahhh mais non Cirec, il veut pas lire tout le fichier puisqu'il y a un CRC avant puis la taille du bloc "richedit".
Et d'ailleurs, rien ne te dit qu'il n' y a rien après dans le fichier...
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 20235 27 juin 2008 à 20:01
Pas grave Florenth, au moins le code de Cirec me donne un aperçus de la façon de faire avec les streams ce qui en effet m'aidera pour quand j'y passerais, au moins y aura déjà des questions que je n'aurais pas besoin de poser ;)
cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 20235 27 juin 2008 à 21:45
Florenth,
Merci pour l'information, cela fonctionne à merveille.
Par contre petite chose, autrement que en faisant une boucle, y a une fonction déjà toute prête pour ensuite utiliser le contenu de mon Dynamic Array dans un String ?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 28 juin 2008 à 10:31
Sinon, autrement, tu peux utiliser exactement la même technique avec un string :
<hr size="2" width="100%" />var
S: string;
FileSize: Integer;
begin
[...]
SetLength(S, FileSize);
BlockRead(F, S[1], FileSize); // version "ancienne"
FileStream.ReadBuffer(S[1], FileSize); // version "flux"
[...]
end;
<hr size="2" width="100%" />
Attention toutefois, les chaînes sont indexées à partir de 1, donc c'est S[1] pour les chaînes qu'il faut transmettre, alors que c'est bien Tab[0] pour les "array of ...".
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 28 juin 2008 à 14:16
hola ... j'ai jamais dit que je donnais la réponse exacte à sa question
mais bel et bien un "exemple juste pour prouver que la lecture avec un array dynamique ça fonctionne" ... et ça fonctionne
et donc pour faire ce qu'il veut il y avait très peu a adapter
sinon j'avais bien vu le CRC et la taille mais ça me semblait pas être le plus important ici pour la compréhension de l'utilisation d'un "array of Char" ... je connais bien ce principe d'écriture je l'a beaucoup pratiqué (j'avais écris un exemple de Stub pour Francky et un compilateur de ressource qui utilisent un principe similaire)
et en ce qui concerne la similitude entre un "array of Char" et un "String" il me semble que la remarque avait été faite dans l'autre thread ... mais elle a du passer inaperçu dans la masse de messages.
et en plus ça lui aura permis de voir "l'astuce" du PChar(array of Char)