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

Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
- - Dernière réponse : Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 août 2018
- 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 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
1
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 108 internautes nous ont dit merci ce mois-ci

Commenter la réponse de florenth
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
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
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 août 2018
42
0
Merci
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
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
1
0
Merci
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
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
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
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
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
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
C'est bon, un simple PChar autour de mon Dynamic Array suffisait ;)
Commenter la réponse de cs_christophedlr
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
1
0
Merci
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
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
ok, merci pour l'information Florenth.
Commenter la réponse de cs_christophedlr
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 août 2018
42
0
Merci
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.