Insertion dans stream [Résolu]

Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
- - Dernière réponse : cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
- 23 mars 2007 à 08:59
hello tout le monde,

est-ce possible d'inserer des données au milieux d'un stream ?

J'ai un class qui dérive de TFileStream et je doit écrire vers le début du fichiers des données que je ne connait qu'après avoir écrire le reste du fichier. Le problème c'est que la taille des données est variable.

J'espère que qqun connaît un truc pour faire ça.

sinon, quel solution altérnative me proposer vous?
2 fichiers et copyfrom? dériver d'une autres class? laquel?

Context:
fichier text de petit taille.

merci d'avance,

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
sincerement, je n'ai pas encore trouver la solution pour inserer des données au milieu d'un stream sans rien appeler autour.

par contre, un truc c'est que j'evite de placer ma table de données au debut du fichier puisque c'est elle qui varie le plus.

en gros ton fichier doit se presenter comme cela :

signature : offset 0..3
offset DAT : offset 4..11
null : offset 12..31
données : offset 32..x
table : offset ?..x

ensuite la DAT doit comporter au moins ces informations :

TDATItem = record
  OffsetStart : int64;
  DataSize    : int64;
end;

TDAT = record
  Count : integer;
  Items : array of TDATItem;
end;

je pense que tu trouveras facilement comment on utilise ce systeme.

<hr size="2" width="100%" />Croc (click me)

Dire « Merci » 3

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

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

Commenter la réponse de f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
aah aussi, si l'ordre des données n'est pas importante, tu veras qu'on peu placer les données dans n'importe qu'elle ordre puisque de toute façon c'est la DAT qui donne un ordre pour sortir les données.

en gros avec ce systeme, tu n'as plus qu'a prendre un TMemoryStream par exemple et a recuperer OffsetStart, DataSize de l'item que tu veux sortir, comme ceci :

TFS.Seek(DAT.Items[x].OffsetStart); // on positionne le stream principal a la position de la donnée
TMS.CopyFrom(TFS, DAT.Items[x].DataSize); // on copie la donnée dans un stream temporaire

<hr size="2" width="100%" />Croc (click me)

Dire « Merci » 3

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

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

Commenter la réponse de f0xi
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
3
Merci
Salut,
Je suis de l'avis de f0xi. L'ordre des données n'est généralement pas important.
Et pour éviter d'utiliser une table de données, tu peux regarder mon source:

http://www.codes-sources.com/code.aspx?ID=39367

Mais si tu tiens absolument à l'insertion, je ne vois pas d'autre solution que de passer par un stream temporaire.

Dire « Merci » 3

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

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

Commenter la réponse de Caribensila
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
0
Merci
ok. merci bien pour ces expliquations/propositions.

j'avais peur d'avoir loupé un truc évident, je me sens rassuré :)

bon, bin je vais devoir ajouter "du code autour".

merci, A+

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Commenter la réponse de cs_Loda