Widestring pour l'enregistrement dans fichier Binaire ??? [Résolu]

Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
- 26 mars 2011 à 13:26 - Dernière réponse :
Messages postés
30
Date d'inscription
mardi 10 mars 2009
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 ???
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 26 mars 2011 à 15:04
3
Merci
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

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
- 24 avril 2012 à 12:51
3
Merci
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]);

Merci DavKli 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de DavKli
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 28 mars 2011 à 10:56
0
Merci
Salut cari,

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

A+


Composants Cindy pour Delphi
Commenter la réponse de cs_MAURICIO
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 28 mars 2011 à 14:39
0
Merci
Bonjour Mauricio,

Oui, en effet.

Si vous voulez bien me suivre, c'est par ici...

_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Commenter la réponse de Caribensila
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 28 mars 2011 à 14:49
0
Merci
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
Commenter la réponse de cs_MAURICIO
Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
- 28 mars 2011 à 15:34
0
Merci
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].
Commenter la réponse de DavKli
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 28 mars 2011 à 15:36
0
Merci
lol,

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

A+


Composants Cindy pour Delphi
Commenter la réponse de cs_MAURICIO
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 28 mars 2011 à 15:47
0
Merci
Ah ben m*** alors !

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


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Commenter la réponse de Caribensila
Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
- 28 mars 2011 à 16:25
0
Merci
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]
Commenter la réponse de DavKli
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 28 mars 2011 à 17:11
0
Merci
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
Commenter la réponse de Caribensila
Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
- 24 avril 2012 à 12:28
0
Merci
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
Commenter la réponse de DavKli
Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
- 24 avril 2012 à 12:35
0
Merci
Si j'utilise

Taille := length(MaString) *2;


ca marche. Une idee pourquoi ?
Commenter la réponse de DavKli
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 24 avril 2012 à 12:57
0
Merci
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.
Commenter la réponse de cs_MAURICIO
Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
- 24 avril 2012 à 16:31
0
Merci
Alors j'ai testé SizeOf pour 10.000 Characters et j'ai toujours le meme resultat, a savoir "2".
Commenter la réponse de DavKli
Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
- 24 avril 2012 à 18:40
0
Merci
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);
[...]
Commenter la réponse de DavKli

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.