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 :

Conversion d'une structure en char*


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut Conversion d'une structure en char*
    Bonjour,

    Je cherche comment enregistrer une structure dans un fichier, de sorte que je puisse la reloader plus tard.

    Prenons un exemple simple: j'ai une équipe de Pokémons:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    //contient toutes les infos sur l'équipe
    struct Team
    {
        //les infos des pokes
        struct Pokes
        {
            Pokes();
            void reset();
            unsigned int num:9;
            Uint16 moves[4];
            char nick[12+1];
            unsigned int item:9;
            unsigned int level:7;
            Uint8 hp_ev;
            Uint8 att_ev;
            Uint8 def_ev;
            Uint8 satt_ev;
            Uint8 sdef_ev;
            Uint8 speed_ev;
            unsigned int nature : 5;
            unsigned int hp_dv : 5;
            unsigned int att_dv : 5;
            unsigned int def_dv : 5;
            unsigned int satt_dv : 5;
            unsigned int sdef_dv : 5;
            unsigned int speed_dv : 5;
            unsigned int gender : 1;
            unsigned int shiney : 1;
            unsigned int ability: 1;
        };
     
        Pokes pokes[6];
        //celles du trainer
        char Trainer_Name[15+1];
        char Trainer_Info[200+1];
        char Trainer_Win[246+1];
        char Trainer_Lose[246+1];
     
        Team();
    };
     
    //gestionnaire de l'équipe
    class TeamBuilder
    {
        private:
           Team equipe;
           ...
        public:
           ...
    };
    Puis je déclare mes fonctions save_team et load_team comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void TeamBuilder::save_team()
    {
        ofstream out("team/team.pcb", ios::binary);
     
        out.write((char *)(void*)(&equipe), sizeof(Team));
    }
     
    void TeamBuilder::load_team()
    {
        ifstream in("team/team.pcb", ios::binary);
     
        in.get((char *)(void*)(&equipe), sizeof(Team));
     
        ...
    }
    Le pire, c'est que ça marche

    Enfin, jusqu'à présent ça marche, mais je voulais savoir s'il y avait des risques de corruption de mémoire, de segfault...
    Parce que ça me paraît louche comme codage

    Ou alors s'il y a une manière tout aussi simple de charger/sauver une structure?


    Merci beaucoup!

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une structure ne comprenant aucun pointeur peut être sauvegardée de la sorte, mais ce n'est pas portable (les fichiers créés sur une architecture ne pourront pas être utilisés directement sur une autre), pour raisons d'endianness et d'alignement.

    Si tu veux sauvegarder ta structure, tu dois définir un format de sauvegarde clair et indépendant de la plate-forme (c'est généralement trivial pour les formats texte, mais pas toujours évident pour un format binaire).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Ca veut dire que si jamais je voulais passer une telle structure via une socket, à une autre machine, de cette manière, il y a un risque pour que ça rate totalement?

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Merci de ta réponse Médinoc.

    J'ai une autre question en tête:
    Dans des exemples de code j'ai vu des macros pour faire tel ou tel comportement selon l'endianness.

    Ca veut dire que si je compile un programme avec une certaine endianness, puis que je transfère ce programme déjà compilé sur un autre ordinateur, alors les deux programmes vont avoir le même comportement quelque soit l'endianness?

    Merci de tes réponses.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Non, un programme une fois compilé ne marche que sur une plate-forme.

    Par contre, il faut toujours coder de manière à faire un code indépendant de l'endianness.
    Principalement, c'est-à-dire ne pas faire de manipulations de pointeur là où c'est un décalage de bits qu'il faut, et évidemment, sérialiser correctement les structures (typiquement, on sérialise chaque entier octet par octet).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Non, un programme une fois compilé ne marche que sur une plate-forme.

    Par contre, il faut toujours coder de manière à faire un code indépendant de l'endianness.
    Principalement, c'est-à-dire ne pas faire de manipulations de pointeur là où c'est un décalage de bits qu'il faut, et évidemment, sérialiser correctement les structures (typiquement, on sérialise chaque entier octet par octet).
    Ok merci.

    Je crois que je vais essayer de me débrouiller le moment venu (je sens que ça va pas être amusant )

    Je met le résolu.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/05/2010, 13h04
  2. Conversion d'une structure de données en char*
    Par lolita4882 dans le forum C
    Réponses: 4
    Dernier message: 04/01/2008, 17h04
  3. conversion d'une string en char
    Par vulkanosaure dans le forum C++
    Réponses: 12
    Dernier message: 02/11/2007, 19h55
  4. [xml]Conversion d'une structure xml en csv
    Par cchatel2000 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 01/08/2005, 16h00
  5. Conversion d'une chaine de char en numerique
    Par simone.51 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/03/2004, 16h47

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