Souci de fstream et string

Résolu
Thieraguibou - 11 avril 2013 à 21:39
 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

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
12 avril 2013 à 11:29
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
3
Thieraguibou
12 avril 2013 à 12:43
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é
0
Rejoignez-nous