Insertion dans stream [Résolu]

Signaler
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
-
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
-
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

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
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)
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
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)
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
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.
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
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.