Dynamic Array renvoyant une erreur de lecture [Résolu]

cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 27 juin 2008 à 15:41 - Dernière réponse : Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention
- 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.
Afficher la suite 

10 réponses

Répondre au sujet
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 27 juin 2008 à 17:23
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de florenth
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 27 juin 2008 à 17:41
0
Utile
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.
Commenter la réponse de cs_christophedlr
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 27 juin 2008 à 18:59
0
Utile
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="" />
Commenter la réponse de Cirec
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 27 juin 2008 à 19:44
0
Utile
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...
Commenter la réponse de florenth
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 27 juin 2008 à 20:01
0
Utile
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 ;)
Commenter la réponse de cs_christophedlr
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 27 juin 2008 à 21:45
0
Utile
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 ?
Commenter la réponse de cs_christophedlr
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 27 juin 2008 à 22:00
0
Utile
C'est bon, un simple PChar autour de mon Dynamic Array suffisait ;)
Commenter la réponse de cs_christophedlr
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 28 juin 2008 à 10:31
0
Utile
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
Commenter la réponse de florenth
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 28 juin 2008 à 10:32
0
Utile
ok, merci pour l'information Florenth.
Commenter la réponse de cs_christophedlr
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 28 juin 2008 à 14:16
0
Utile
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="" />
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.