Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Dynamic Array renvoyant une erreur de lecture [ Divers / Débutant(e) ] (christophedlr)

vendredi 27 juin 2008 à 15:41:55 | Dynamic Array renvoyant une erreur de lecture

christophedlr

Membre Club
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.

vendredi 27 juin 2008 à 17:23:13 | Re : Dynamic Array renvoyant une erreur de lecture

florenth

Membre Club
Réponse acceptée !
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.net [ Lien ]

vendredi 27 juin 2008 à 17:41:30 | Re : Dynamic Array renvoyant une erreur de lecture

christophedlr

Membre Club
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.

vendredi 27 juin 2008 à 18:59:37 | Re : Dynamic Array renvoyant une erreur de lecture

cirec

Membre Club Administrateur CodeS-SourceS
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


vendredi 27 juin 2008 à 19:44:17 | Re : Dynamic Array renvoyant une erreur de lecture

florenth

Membre Club
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...

vendredi 27 juin 2008 à 20:01:39 | Re : Dynamic Array renvoyant une erreur de lecture

christophedlr

Membre Club
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 ;)

vendredi 27 juin 2008 à 21:45:23 | Re : Dynamic Array renvoyant une erreur de lecture

christophedlr

Membre Club
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 ?

vendredi 27 juin 2008 à 22:00:20 | Re : Dynamic Array renvoyant une erreur de lecture

christophedlr

Membre Club
C'est bon, un simple PChar autour de mon Dynamic Array suffisait ;)

samedi 28 juin 2008 à 10:31:14 | Re : Dynamic Array renvoyant une erreur de lecture

florenth

Membre Club
Sinon, autrement, tu peux utiliser exactement la même technique avec un string :


var
  S: string;
  FileSize: Integer;
begin
  [...]
  SetLength(S, FileSize);
  BlockRead(F, S[1], FileSize);  // version "ancienne"
  FileStream.ReadBuffer(S[1], FileSize); // version "flux"
  [...]
end;


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.net [ Lien ]

samedi 28 juin 2008 à 10:32:16 | Re : Dynamic Array renvoyant une erreur de lecture

christophedlr

Membre Club
ok, merci pour l'information Florenth.


1 2

Cette discussion est classé dans : string, erreur, var, array, dynamic


Répondre à ce message

Sujets en rapport avec ce message

Dynamic array vers Fichier [ par balgrim ] J'AI BESOIN D'AIDE !!! Comment envoyer tout un tableau dynamique constitué de classe dans un fichier sans devoir sauvegarder chaque variable 1 par 1.. Fonction qui retourne un array of string [ par arthur07 ] DR@G Bonjour, J'aurais besoin d'aide pour une fonction qui doit retourné un tableau. function Query(Query : string) : arr String et Array [ par xionoxid ] Bonjour C'est une très bete question : à propos des String et Array je voudrais enregistrer la valeur de "paramstr(1); " dans path pour le faire execu BlockRead [ par dxh_master ] Salut a tous je vous en suppppppplie aider moi avec block read voila ma fonction qui me donne erreur e/s 998 : Function Readhexa(Fichier:string;offese [TP7] Concaténér une chaîne [ par ghuysmans99 ] Bonjour à tous.Je suis en train de faire une fonction de cryptage xor en Turbo Pascal 7.Seul petit problème : il ne veut pas ajouter le caractère cryp Manipuler un tableau dynamique dans une procédure [ par Enkidou ] Bonjour,j'ai un tableau dynamique que j'envoie en paramètre par adresse à une procédure.Cependant lorsque j'essaie de l'y redimensionner il me sort un Passer d'un String à un dynamic Array et inversement [ par christophedlr ] Bonsoir,J'ai remarqué que pour qu'une donnée s'écrive correctement dans un fichier avec BlockWrite, il fallait un array of  char (par exemple).Mais j' String & Tstring [ par bidulchouette ] Tout d'abord bonjour a tous, bonne année et meilleurs voeux!!!!Voila je suis en trin de travailler sur une application qui permet incompatibilité de types [ par domsig ] bonjour à tous pour le boulot j'écris un programme en delphi5 qui doit effacer des fichiers. Quand je compile mon source j'ai une erreur "Types incomp Pointeur sur une instance d'objet [ par Hnimsgern ] Bonjour,J'ai besoin d'un tel pointeur pour avoir accés aux variables et aux fonctions d'un objet. L'objet instancié (partiel) est le suivant :type TRe


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.