Dynamic Array renvoyant une erreur de lecture

[Résolu]
Signaler
Messages postés
259
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
4 juillet 2021
-
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
-
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

Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
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
Messages postés
259
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
4 juillet 2021
4
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.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
45
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="" />
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
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...
Messages postés
259
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
4 juillet 2021
4
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 ;)
Messages postés
259
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
4 juillet 2021
4
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 ?
Messages postés
259
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
4 juillet 2021
4
C'est bon, un simple PChar autour de mon Dynamic Array suffisait ;)
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
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
Messages postés
259
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
4 juillet 2021
4
ok, merci pour l'information Florenth.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
45
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="" />