Dynamic Array renvoyant une erreur de lecture

Résolu
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 - 27 juin 2008 à 15:41
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 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);

SetLength(FileXML, SizeFile);
BlockRead(F, FileXML, SizeFile);
end;

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.

Merci d'avance pour l'aide.

10 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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.

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
3
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
27 juin 2008 à 17:41
Merci pour l'information Florenth, je teste cela se soir.

P.S.: Pas de soucis, j'y penserais, je me rendais compte qu'il allait falloir tôt ou tard penser a passer vers les streams.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 juin 2008 à 18:59
Salut,

j'ai bien compris que tu n'aimes pas tellement utiliser les Streams ... mais moi j'aime pas utiliser BlockWrite/Read etc

donc l'exemple est fait avec les Streams ... c'est juste pour te prouver que ça fonctionne

procedure TForm1.Button1Click(Sender: TObject);
var fs: TFileStream;
    ac: arrayof char;
begin
  fs := TFileStream.Create('EnlargeImage.bin',  fmOpenReadWrite);
  try
    SetLength(ac, fs.size);
    fs.ReadBuffer(ac[0], fs.Size-1);
    RichEdit1.Lines.Text : = PChar(ac);
  finally
    Finalize(ac);
    fs.free;
  end;
end;

 
@+
Cirec

<hr siz="" />
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
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 ;)
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
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 ?
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
27 juin 2008 à 22:00
C'est bon, un simple PChar autour de mon Dynamic Array suffisait ;)
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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 ...".

Ouais, je sais, c'est un peu piégeux !

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
28 juin 2008 à 10:32
ok, merci pour l'information Florenth.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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)

 
@+
Cirec

<hr siz="" />
0
Rejoignez-nous