Widestring pour l'enregistrement dans fichier Binaire ???

Résolu
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013 - 26 mars 2011 à 13:26
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013 - 24 avril 2012 à 18:40
Bonjour j'ai une sorte de base de donnée et souhait d'enregistrer dans un fichier Binaire. Voici une exemple

type
  TExemple = Record
    Data1: String[2500];
    Data2: Integer;
end;


Eh ben, il est claire qu'un string d'une taille de 2500 n'existe pas. Dont quelle solution pour enregistrer mes chaines de texte ???

14 réponses

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
26 mars 2011 à 15:04
Salut,

Quand la taille de la variable n'est pas fixée, l'astuce consiste à d'abord écrire sa taille dans le fichier sous la forme d'un Integer, puis la variable elle-même.
A la lecture, on lira d'abord cette taille et on créera une variable de cette taille du type requis. Puis on lui affectera le contenu du fichier.

Exemple :

var MaChaine : string;
    Taille : Integer; 

//Ecriture de MaChaine :
Taille :length(MaString);//Taille(en octets) longueur de la chaîne.
FileStrm.WriteBuffer(Taille,SizeOf(Taille));//On écrit d'abord la taille de la chaîne qui va suivre(un Integer, donc) ...
FileStrm.WriteBuffer(MaString[1],Taille);//...puis la chaîne en transmettant un pointeur sur son 1er caractère, et sa taille.



//Lecture de MaChaine :
FileStrm.ReadBuffer(Taille,SizeOf(Integer));//Lit la taille de la chaîne.
SetLength(MaString,Taille);//Allocation d'assez d'espace dans la chaîne.
FileStrm.ReadBuffer(MaString[1],Taille);//Lecture de la chaîne grâce à la transmission d'un pointeur (MaString[1]).




_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
3
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013
24 avril 2012 à 12:51
Ok, le buffer ne prend pas en compte le nombre des characteres mais aussi le nombre de bytes. Par la suite, la taille doit etre

  Taille := length(MaString) * SizeOf(MaString[1]);
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
28 mars 2011 à 10:56
Salut cari,

il me semble d' ailleurs que tu as une source dans ce style!?

A+


Composants Cindy pour Delphi
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
28 mars 2011 à 14:49
On pourrait aussi (pour simplifier) définir un caractère pour séparer les différents enregistrements/champs:
champ1=xxxxx[ESC]champ2='10.21'[ESC][ESC]
champ1=yyyyy[ESC]champ2='10.33'[ESC][ESC]
etc ...
Ord(ESC)=27

Un des gros avantages de cette méthode est qu' elle permet de récupérer la table plus facilement s' il y a eu problème lors de l' enregistrement.

A+


Composants Cindy pour Delphi
0

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

Posez votre question
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013
28 mars 2011 à 15:34
Bon, moi je suis un peu perdu... Le fichier que fait enregistre plusieurs types de données, entre autre des integer et des dates/times. Le longue strings sont juste une partie. Je vais essaier avec array of char[1..2000].
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
28 mars 2011 à 15:36
lol,

tu veux une bonne idée simple? le TClientDataset!

A+


Composants Cindy pour Delphi
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
28 mars 2011 à 15:47
Ah ben m*** alors !

J'pensais pourtant avoir bien expliqué sur ce coup...


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
0
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013
28 mars 2011 à 16:25
eh m****, j'ai égaré mon dictionnaire francais - delphifr / delhifr - français. Et google Translation m'as pas beaucoup aidé sur ce coup la.

voila mes données a enregistrer :

  
TRssFeed = record
    Index: Integer;
    Link: string[1000];
    Title: String[255];
    DateAdd: TDate;
    LastUpdate: TDateTime;
    LastResult: (Succes, Failed, New);
    Folder: Integer;
end;
TRSSFeedFile = file of TRssFeed;


et pour enregistrer, j'utilise
for int1 := 1 to length(MyListActuelle) do
Write(TRSSFeedFile, MyListActuelle[int1-1]);


et voila, l'erreur est le string[1000]
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
28 mars 2011 à 17:11
Ah oué. Je comprends que tu ne comprenais pas... Ce n'est pas un fichier binaire !


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
0
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013
24 avril 2012 à 12:28
Quand la taille de la variable n'est pas fixée, l'astuce consiste à d'abord écrire sa taille dans le fichier sous la forme d'un Integer, puis la variable elle-même.
A la lecture, on lira d'abord cette taille et on créera une variable de cette taille du type requis. Puis on lui affectera le contenu du fichier.


Bonjour,

j'utilise l'exemple en haut pour ecrire mon fichier binaire mais pendant l'enregistrement, mon string est coupé en deux. En effet, seulement la moitie est enregistre malgre que j'ai indiqué la taille.

La longuer du string est de 464. Apres enregistrement et lecture, il se trouve a 232. Est ce possible que les caracteres speciales ont besoin un buffer plus grande ?

Mon string est : http://news.google.com/news'hl=en&q="Bonikro"+OR+"Tongon"+OR+"IamGold"+OR+"Randgold"+OR+"Newcrest+Mining"+OR+"Societe+des+Mines+d'Ity"+OR+"Equigold"+OR+"Essakane"+OR+"Taparko"+OR+"Inata"+OR+"African+Minerals"+OR+"Bissa+Gold"+OR+"Sierra+Rutile"+OR+"Koidu+Holdings"+OR+"Nantou+Mining"+OR+"Burkina+Manganese"+OR+"High+River+Gold"+OR+"Volta+Resources"+OR+"Societe+Miniere+de+Belahouro"+OR+"Burkina+Mining+Company"+OR+"TAIA+LION+RESOURCES"+OR+"London+Mining"&output=rss

Merci a vous
0
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013
24 avril 2012 à 12:35
Si j'utilise

Taille := length(MaString) *2;


ca marche. Une idee pourquoi ?
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
24 avril 2012 à 12:57
Faux:
Taille := length(MaString) * SizeOf(MaString[1]);

car SizeOf(MaString[1] peut être différent de SizeOf(MaString[2] selon le caractère !!!

Le plus simple est de faire:
- créer un champ de type memo.
- utiliser un TClientdataset pour lire/écrire dans le champ memo.

A+


Composants Cindy pour Delphi
Faites une donation.
0
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013
24 avril 2012 à 16:31
Alors j'ai testé SizeOf pour 10.000 Characters et j'ai toujours le meme resultat, a savoir "2".
0
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013
24 avril 2012 à 18:40
J'ai pu reglé le probleme de Buffer Taille par encoder le string.

Voici la procedure pour Read

var
  F : TFileStream;
  BufSize: Integer;
  Str1: UTF8String;
  Str2: String;

[...]
  F.ReadBuffer(BufSize, 4);
  SetLength(Str1, BufSize);
  F.ReadBuffer(Str1[1], BufSize);
  Str2 := UTF8ToString(Str1);
[...]


Et pour Write

var
  F : TFileStream;
  BufSize: Integer;
  Str1: UTF8String;
  Str2: String;

[...]
  Str1 := UTF8String(Str2);
  BufSize := Length(Str1);
  F.WriteBuffer(BufSize, 4);
  F.WriteBuffer(Str1[1], BufSize);
[...]
0
Rejoignez-nous