IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Ecrire un objet dans un flux [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 62
    Par défaut Ecrire un objet dans un flux
    bonsoir,

    je cherche à écrire un objet dans un TFileStream ou un TMemoryStream.
    J'utilise donc les methodes write pour écrire et read pour relire.
    Voila mon code pour écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TFileStream *FS = new TFileStream("c:\\test0.dat", fmCreate);
    int size = sizeof(MonObjet);
    FS->Write(MonObjet, size);
    delete FS;
    et pour relire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TMaClass *MonObjet = new TMaClass;
    TFileStream *FS = new TFileStream("c:\\test0.dat", fmOpenRead);
    int size = FS->Size;
    FS->Read(MonObjet, size);
    delete FS;
    ce code se compile et s'execute sans aucun problème, si ce n'est que je ne récupère pas MonObjet dans l'état ou je l'ai enregistré Il me manque une grande partie des variables initialement présente dans MonObjet avant la sauvegarde ....
    J'ai l'impression que le pb vient de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int size = sizeof(MonObjet);
    qui ne corresponderait à la taille réelle de mon objet ......

    Quelle erreur je fais et comment corriger ça ?

    Merci

    EDIT : pour info, si je créé une structure avec exactement les même variables que celles contenues dans ma TMaClass, je peux sauvegarder et restaurer cette structure sans aucun problème avec le code ci-dessus

  2. #2
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TFileStream *FS = new TFileStream("c:\\test0.dat", fmCreate);
    int size = sizeof(MonObjet);
    FS->Write(MonObjet, size);
    delete FS;
    je pars de la supposition suivante (établie d'après la suite du code pour lire ), que MonObjet est un pointeur et qu'il est instancié classiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMaclass * MonObjet = new TMaClasse(....);
    dans ce cas la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int size = sizeof(MonObjet);
    est équilvalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int size = sizeof(TMaclass *);
    ce qui est la taille d'un pointeur sur objet et non la taille de l'objet .

    dans ce cas il faudrait plutot ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int size = sizeof(TMaclass);

    //-------------------------------------------------
    pour la 2ème partie du code,
    la ligne:

    suppose que ton ficher ne contient qu'un et un seul objet car taille de fichier = taille d'un objet
    mais s'il y a plusieurs objets identiques , ça ne marche plus.
    Il faudra séparer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int fs_size = FS->Size; //taille du fichier
    int obj_size = sizeof(TMaClasse);     //taille de l'objet
    int nb_objects = fs_size/obj_size; //nombre d'objets écrits

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 62
    Par défaut
    Citation Envoyé par Djob
    je pars de la supposition suivante (établie d'après la suite du code pour lire ), que MonObjet est un pointeur et qu'il est instancié classiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMaclass * MonObjet = new TMaClasse(....);
    Oui, j'avais omis de le préciser, mais c'est tout à fait ça.

    Citation Envoyé par Djob
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int size = sizeof(MonObjet);
    est équilvalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int size = sizeof(TMaclass *);
    ce qui est la taille d'un pointeur sur objet et non la taille de l'objet .

    dans ce cas il faudrait plutot ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int size = sizeof(TMaclass);
    Super !! c'est bien ça. Maintenant ça marche nickel !!
    J'avais bien compris de mon pb tournait autour le la taille des données à enregistrer mais je bloquait là ! Maintenant je comprend mon erreur

    Citation Envoyé par Djob
    pour la 2ème partie du code,
    la ligne:

    suppose que ton ficher ne contient qu'un et un seul objet car taille de fichier = taille d'un objet
    mais s'il y a plusieurs objets identiques , ça ne marche plus.
    Il faudra séparer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int fs_size = FS->Size; //taille du fichier
    int obj_size = sizeof(TMaClasse);     //taille de l'objet
    int nb_objects = fs_size/obj_size; //nombre d'objets écrits
    Oui bien sûr, mais dans un premier temps je cherchais déjà à le faire fonctionner avec un seul objet

    Merci beaucoup

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 62
    Par défaut
    Salut,

    je fais remonter ce post car en fait ça ne fonctionne pas si nickel que ça

    En fait ça fonctionne tres bien "à première vue", mais y me reste un pb que je ne m'explique pas. Je ne peux pas relire mon fichier si je ferme mon appli !!

    C'est à dire que quand j'enregistre mon fichier, tout se passe bien et je peux le relire tant que je ne ferme pas l'appli. Si je la ferme et la relance, ça plante dés que je veux relire le fichier en question !!! j'ai beau chercher, vérifier et re-vérifier mais je ne comprend pas pourquoi !!

  5. #5
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    Je suppose que c'est parce que tu utilise des types de taille indéterminée
    dans la classe de Objet (voire des pointeurs sur autre chose ?),
    genre String, etc...
    et donc se serait encore le même probleme de sizeof ...
    ..le compilateur ne peut pas deviner combien d'octets il doit écrire...

    N'ayant pas le détail de ta classe, cela reste une supposition...


    Si cela est le cas cela expliquerait pourquoi cela fonctionne quand tu lis des enregistrements fraichement écrits : dans ton fichier , par exemple si tu utilises un String, seule son adresse memoire est écrite dans le fichier..et donc tu peux la lire correctement.
    Si tu fermes et essaie de le relire, évidemment ça ne marchera plus car l'adresse a été libérée...


    exemple de TMyObect qui fonctionnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int index;
    char titre[50];
    char desc[100];

    NB: pour gérer l'ecriture d'objets plus complexes avec String , pointeur sur objet,etc...
    il faudrait implementer des méthodes WriteToStream(TStream *Stream )
    et ReadStream(TStream *Stream)..dans ta classe:
    par exemple pour gérer la taille de ton string..

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 62
    Par défaut
    bon donc c'est bien ça dans mes données à enregistrer il y a un TList .... c'est donc lui qui me fiche tout en l'air (je viens de tester sans et y a pas de pb).

    Merci, je vais essayer de regarder la piste que tu me proposes ......

Discussions similaires

  1. Ecrire des objets dans un fichier
    Par Edta dans le forum Langage
    Réponses: 2
    Dernier message: 14/05/2008, 04h29
  2. Ecrire des donnes dans un flux xml
    Par jul-974 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/06/2007, 01h48
  3. Ecrire un objet dans un fichier
    Par skeltryx dans le forum C#
    Réponses: 3
    Dernier message: 11/05/2007, 13h31
  4. Ecrire des valeurs dans un objet OLE Excel
    Par NewbiePower dans le forum Access
    Réponses: 4
    Dernier message: 08/02/2007, 08h59
  5. Ecrire un objet dans un fichier
    Par mikebranque dans le forum C++
    Réponses: 3
    Dernier message: 14/03/2006, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo