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++ Discussion :

Question sur la sauvegarde d'objet.


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut Question sur la sauvegarde d'objet.
    Bonjour à tous,
    Je suis en train de me documenter sur la sauvegarde d'objet et jusque là j'ai compris qu'il existe deux methodes:
    -Une méthode "à la main"
    -La sérialisation avec boost.

    Pourtant voici ce que je voudrais faire:
    -1 récupérer l'adresse et la taille de mon objet.
    -2 faire une copie bit à bit de la plage mémoire définie en 1.
    -3 et voilou.

    Est-ce possible?

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 171
    Par défaut
    Bonjour,

    Tu risques d'être embêté si ton objet contient des pointeurs vers d'autres objets. Avec ta méthode, tu copieras le pointeur, mais pas le contenu de cet autre objet.

    Et puis si tu copies bit a bit, la sauvegarde de ton objet risque de ne pas être lisible par toutes les plateformes (mais c'est peut-être pas ton besoin) avec les alignement des champs qui peuvent être différents selon les plateformes.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Ce que tu veux faire est possible, en utilisant les fichiers ouverts en "mode binaire", mais sujet à problèmes sans noms...

    Le premier problème auquel tu risque d'être confronté, c'est celui de la taille des chaines de caractères, si tu en utilise, qui devront obligatoirement être des chaines de caractères "C style" (tableau de caractères terminé par '\0') et dont la taille devra être limitée à une taille arbitrairement choisie qu'il sera hors de question de dépasser...

    Cela *risque* de t'empêcher de mettre toutes les informations qui pourraient t'intéresser dans la chaine de caractère, et risque tout autant, si certains objets n'utilisent que des chaines de 2 ou 3 caractères, alors que tu aurais mis la limite à mettons 20, de provoquer une perte inutile d'espace mémoire...

    Les problèmes de compatibilité non seulement inter-plateforme, mais carrément inter-compilateurs ou d'écriture de l'adresse mémoire d'un pointeur plutôt que de son contenu évoqués Aurelpitiless sont un autre pan de ces problèmes sans noms

    Et il ne faut pas oublier enfin les problèmes de boutisme qui peuvent apparaitre pour les types non caractères entre différentes architectures...

    En définitive, c'est possible, mais cela t'amènera à travailler de manière particulièrement non portable...

    Est-ce que la restriction apportée se justifie C'est rarement le cas
    Si tu persiste malgré tout dans cette optique, la solution prendra la forme de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* soit MyStruct est la structure à sauvegarder */
    void save(MyStruct const & s, std::string const& filename)
    {
        std::ofstream ofs(filename.c_str(),std::ios::bin);
        ofs.write(reinterpret_cast<char*>(&s),sizeof(struct));
    }
    /* si tu as un conteneur de MyStruct de type std::vector, cela peut prendre
     * la forme de
     */
    void save(std::vector<MyStruct >, std::string const& filename)
    {
        std::ofstream ofs(filename.c_str(),std::ios::bin);
        ofs.write(reinterpret_cast<char*>(&s[0]),sizeof(struct)*tab.size());
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    Je n'avais pas imaginer que cela puisse soulever tous ces problèmes....Je pensais simplement à un manque de performance négligeable dans mon cas.
    Je m'en retourne donc vers la sérialisation.
    Merci pour vos explications!!

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Pour compléter et en rajouter une couche:

    Il devient réellement intéressant de travailler avec des données binaires lorsqu'il est hors de question que les données puissent être représentées sous la forme de texte "classique".

    Je pense, entres autres et de manière non exhaustive, au données ayant subi un algorithme de compression ou au données de manipulation d'image (qui, bien souvent, auront aussi subi un algorithme de compression )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/02/2007, 05h26
  2. Question sur la sauvegarde de données
    Par petitprince dans le forum Delphi
    Réponses: 58
    Dernier message: 12/10/2006, 22h03
  3. [Excel][VBA] Questions sur la hiérarchie des objets
    Par cladsam dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/08/2006, 15h59
  4. [Délestage]question sur les sauvegardes
    Par stephan55 dans le forum Oracle
    Réponses: 12
    Dernier message: 14/06/2006, 15h50
  5. [FLASH 8] Question sur la portée des objets.
    Par i_shinji dans le forum Flash
    Réponses: 1
    Dernier message: 02/11/2005, 18h18

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