Souci de fstream et string [Résolu]

- - Dernière réponse :  Thieraguibou - 12 avril 2013 à 12:43
bonsoir j'ai ecri ce code mais j'ai un souci. je vous montre le code:

============Groupe.h========================================
#ifndef Groupe_h
#define Groupe_h

#include
#include <fstream>

class Groupe{
private:
std::string m_code;
int m_num;
public:
//constructeur
Groupe(std::string code);

//accesseurs
std::string getCode()const{ return m_code; }
std::string getNum()const{ return m_num; }

//mutateurs
void setCode(std::string code){ m_code = code; }
void setNum(int nom){ m_num = num; }

//methode de sauvegarde et de restauration
void sauvegarder(std::ofstream & fic)const;
void restaurer(std::ifstream & fic)const;

};

#endif
======================Groupe.cpp==============================
#include "Groupe.h"
using namespace std;

//definition du constructeur
Groupe::Groupe(std::string code):m_code(code),m_nom(""),m_num(0){}

//methode de sauvegarde et de restauration
void Groupe::sauvegarder(std::ofstream & fic)const
{
fic.write((char *)this,sizeof(*this));
}

void Groupe::restaurer(std::ifstream & fic)const
{
fic.read((char *)this,sizeof(*this));
}

====================main.cpp=================================
#include
#include <fstream>

#include "Groupe.h"

using namespace std;

int main(int argc, char **argv) {

Groupe g1("7a");

cout<<"==============CREATION DES OBJETS================"<<endl;

cout<<"Groupe = "<<g1.getCode()<<endl;

ofstream fic("planing", ios::out|ios::binary|ios::trunc);
if(fic.is_open())
{
g1.sauvegarder(fic);
fic.close();
}
cout<<"sauvegarde effectuée avec succès"<<endl;

cout<<"=================MODIFICATION DES OBJETS=================="<<endl;
g1.setCode("00ACB");

cout<<"==============AFFICHAGE DES OBJETS APRES MODIFICATION================"<<endl;
cout<<"Groupe = "<<g1.getCode()<<endl;


ifstream fic1("planing", ios::in|ios::binary);
if(fic1.is_open())
{
g1.restaurer(fic1);
fic1.close();
}

cout<<"==============AFFICHAGE DES PREMIERS OBJETS CREE AVANT MODIFICATION================"<<endl;
cout<<"Groupe = "<<g1.getCode()<<endl;

return 0;
}
=======================Fin du code========================================
mon souci est le suivant je n'arrive pas à afficher l'attribut m_code de ma classe Groupe apres sauvegarde et restauration
Est ce que quelqu'un peut me proposer une solution SVP
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
3
Merci
Bonjour.

Tout d'abord, merci d'utiliser à l'avenir les balises de code.

Ensuite, pour ton souci, c'est normal que ça ne fonctionne pas. Tu écris "this" et cherche ensuite à écraser celui-ci avec l'ancien this que tu avais sauvegardé. Sauf que ce n'est pas possible. Quand on veut "sauvegarder" une classe, on cherche au final à sauvegarder les valeurs qui sont intéressantes et changeantes et non toute la classe (et tout ce que tu ne vois pas, et surement pas le pointeur lui même, qui aura forcément une adresse différente entre deux exécutions).

Pour faire ce que tu veux, il te faut changer les méthodes "sauvegarder" et "restaurer", et n'agir que sur les attributs de ta classe. C'est-à-dire écrire dans le fichier, les attributs un à un, puis les lors d'une restauration, les relire dans le bon ordre.

Quelques conseils:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Pas besoin de faire un .close sur les fichier (std::ifstream et std::ofstream), ils se referment tout seul.
- Pas besoin de mettre un std::ios::in, sur un std::ifstream ou un std::ios::out sur un std::ofstream, c'est implicite.
- Ce que tu cherches à réaliser s'appelle la "sérialisation". Un outil qui fait très bien cela est "Google protobuf". Tu as aussi boost qui propose d'automatiser ce genre d'action (via boost::serialization).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
0
Merci
Merci beaucoup pour les conseils.
maintenant j'ai fait comme suit et ça marche

//methode de sauvegarde et de restauration
void Groupe::sauvegarder(std::ofstream & fic)
{
fic.write((char *)&m_id,sizeof(int));
fic << m_code<<endl;
}

void Groupe::restaurer(std::ifstream & fic)
{
fic.read((char *)&m_id,sizeof(int));
getline(fic,m_code);
}
sinon ça m'avait trop fatigué
Commenter la réponse de Thieraguibou