Insertion dans stream

Résolu
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 22 mars 2007 à 13:44
cs_Loda Messages postés 814 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.

4 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 mars 2007 à 15:36
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)
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 mars 2007 à 15:40
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)
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
22 mars 2007 à 18:29
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.
3
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
23 mars 2007 à 08:59
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.
0
Rejoignez-nous