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

SL & STL C++ Discussion :

Enregistrer une classe contenant des std::string dans un fichier binaire


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut Enregistrer une classe contenant des std::string dans un fichier binaire
    Bonjour à tous,

    J'aimerais enregistrer une classe contenant des std::string dans un fichier binaire (et bien sur, j'aimerais la charger ultérieurement).
    Pour cela j'ouvre mon fichier en mode std::ios::binary et j'utilise les méthodes write() et read() des classes fstream, ifstream et ofstream (ex : write(char*)(&ma_classe), sizeof(ma_classe)).
    Le problème c'est que tous les types qui utilisent des pointeurs (dans le cas des std::string un char*) pour allouer de la mémoire dynamiquement (c'est valable aussi pour tous les conteneurs de la STL) n'enregistrent pas ce que leurs pointeurs pointent et c'est justement ce dont j'ai besoin.
    Dans mon cas je ne veux enregistrer que des string, des int et des bool (pas de problème pour ces deux derniers types).
    J'aimerais donc savoir si quelqu'un à trouvé une méthode efficace pour enregistrer une instance d'un objet contenant des std::string.
    J'avais pensé à un truc du genre :

    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
    struct ma_classe
    {
         int a;
     
         bool b;
     
         std::string c;
     
        struct save
        {
              int sa;
              bool sb;
              char sc[???];
        };
    };
    Le problème c'est qu'il est interdit décrire "char sc[c.size()]"!

    Merci d'avance de votre aide!

    Spartan03
    Pourquoi faire simple quand on peut faire compliqué!

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    As-tu regardé du côté de la serialization ?

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Miles
    As-tu regardé du côté de la serialization ?
    boost::serialization par exemple ?

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    N'aurais tu pas un chance d'y arriver en utilisant tout simplement la méthode c_str() de tes std::string ???

    Pour rappel, et sauf erreur de ma part, on ne peut jamais etre sur que toutes les lettres d'une std::string soient contigues en mémoire.

    Quand tu écrit (char *) &tachaine; ce que tu fais en réalité, c'est transtyper le pointeur de ta chaine en pointeur de type char...

    Par contre, la méthode c_str(), elle, renvoie un tableau de caractères créé à partir de l'ensemble des caractères de ta chaine ;-)

    L'instruction serait donc plutot du genre de write(tachaine.c_str(),tachaine.size())

    Pour info: la valeur renvoyée par la méthode size() est le nombre de caractères de la chaine, or, sizeof(char) renvoie d'office ...1...

    De la meme manière, ta structure save serait avantageusement transformée sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struc save
    {
              int sa;
              bool sb;
              char *sc;
    };
    avec une initialisation de sc "qui va bien" sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    save.sc=tachaine.c_str();
    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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Je pense que je vais utiliser la sérialisation (je ne savais même pas que ça existait ). Je suis en train de regarder du côté de boost::serialization!
    Pourquoi faire simple quand on peut faire compliqué!

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Ah, ben, je ne voulais pas t'obliger à utiliser une méthode plutot qu'une autre...

    Je voulais "juste" attirer ton attention sur le fait que la std::string dispose de méthodes qui permettent de récupérer un (pointeur sur) tableau de caractères et la taille de la chaine...

    On l'oublie trop souvent, mais "il n'y a pas de mauvaise solution en informatique, seulement certaines sont plus (ou moins) efficaces que d'autres"

    Si boost::serialization te semble plus facile à utiliser ou plus efficace, cela reste du domaine de ton libre arbitre
    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

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par koala01
    Ah, ben, je ne voulais pas t'obliger à utiliser une méthode plutot qu'une autre...

    Je voulais "juste" attirer ton attention sur le fait que la std::string dispose de méthodes qui permettent de récupérer un (pointeur sur) tableau de caractères et la taille de la chaine...

    On l'oublie trop souvent, mais "il n'y a pas de mauvaise solution en informatique, seulement certaines sont plus (ou moins) efficaces que d'autres"

    Si boost::serialization te semble plus facile à utiliser ou plus efficace, cela reste du domaine de ton libre arbitre
    Désolé, je n'avais pas cerné complètement la méthode write()! Je pensais qu'elle devait écrire tout le fichier d'un seul appel (allez savoir pourquoi ) et je n'avais pas réalisé que write écrirait à partir du pointeur qu'on repace avec la méthode seekg().
    Du coup ça change tout, ta méthode devient beaucoup plus simple.
    Je garde la sérialization de côté pour le moment!

    Merci beaucoup à tous!
    Pourquoi faire simple quand on peut faire compliqué!

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Ce n'est pas grave

    Penses seulement au fait que, si tu réécris au milieu d'un fichier, il faut prendre la précaution que la taille de ce que tu écrit doit etre strictement égale à celle de ce qui doit etre remplacé dans le fichier, sous peine d'effacer les informations suivantes, ou, au contraire, de laisser des informations obsolètes...

    Si ce n'est pas pour rajouter des informations à la fin du fichier , mais seulement les mettre à jour, avec une taille possiblement différente, il est largement préférable de réécrire tout le fichier
    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. [XL-2010] Afficher une image contenant des valeurs changeantes dans une autre cellule
    Par TeethBrush3r dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/08/2013, 17h36
  2. Comment écrire un "string" dans un fichier binaire
    Par debutant100 dans le forum Langage
    Réponses: 4
    Dernier message: 26/03/2012, 17h40
  3. Réponses: 8
    Dernier message: 15/03/2011, 12h24
  4. Réponses: 26
    Dernier message: 20/06/2010, 18h24
  5. Réponses: 7
    Dernier message: 10/06/2008, 15h38

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