Serialisation d'un vecteur

Résolu
Spawn3107 Messages postés 84 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 28 mars 2011 - 19 mai 2007 à 12:47
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 22 mai 2007 à 13:31
Bonjour,

J'ai un vecteur qui est utilisée pour mémoriser les divers membres du
personnel, donc des instances de la classe MembrePersonnel (qui hérite de personne) et des classes dérivées. La classe résultant est la
classe Personnel.
Cette classe Personnel a pour rôle de faciliter
l'utilisation d'un fichier supporté par un flux et contenant les renseignements
concernant les divers membres du personnel.Mon vecteur contient des pointeurs d'objets, parce que je veux stocker des MembrePersonnel ou autres personnels.

Mes classes :
class Personne
{ ... }

class MembrePersonnel : public Personne
{ .. }

class PersonnelAdmin : public MembrePersonnel
{ ... }

Insertion dans le vecteur :
    ...
    if(type=="MembrePersonnel")
    {
        MembrePersonnel* Mp = new MembrePersonnel;
        Mp->EncodePers();
        Vectpersonne.push_back(Mp);
    }
    if(type=="PersonnelScientifique")
    {
        PersonnelScientifique* Psc=new PersonnelScientifique;
        Psc->EncodePers();
        Vectpersonne.push_back(Psc);
    }
    ...
Maintenant, je veux sauvegarder le vecteur dans un fichier :
class Personnel
{
protected:
    string NomFich;
    vector Vectpersonne;
    ...
    void Personnel::Save_Fich()
    {
        ofstream fichier;
        fichier.open(nom, ios::out);
        for(int i=0;i<(int)Vectpersonne.size();i++)
        {
              fichier<<*Vectpersonne[i];
        }
        fichier.close();
    }
}

Maintenant après la sauvegarde, mon fichier contient seulement les variables de la classe personne et non ceux de PersonnelAdmin.
Comment est ce que je peux obtenir tout les champs en fonction du personnel que je veux ajouter ?

Merci !

29 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
21 mai 2007 à 23:46
Ah bas oui attention. Le mot "static" n'apparait que dans la classe, et quand tu définies une fonction membre de l'extérieur, faut bien préciser son "adresse" => tu pourrais tres bien définir une fonction BuildObjectFromFile(..) qui n'a rien a voir avec la classe.

Dans Personne.cpp :

Personne * Personne::BuildObjectFromFile(ifstream & _inFile)
{
...
}
0
Spawn3107 Messages postés 84 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 28 mars 2011
21 mai 2007 à 23:51
J'ai enleve le static dans le .cpp, mais j ai toujours la même erreur . (Dans le fichier Personnel.obj)

Erreur    2    error LNK2001: symbole externe non résolu "public: static class Personne * __cdecl Personne::BuildObjectFromFile(class std::basic_ifstream<char,struct std::char_traits<char> > &)" (?BuildObjectFromFile@Personne@@SAPAV1@AAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@Z)    Personnel.obj   
0
Spawn3107 Messages postés 84 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 28 mars 2011
21 mai 2007 à 23:58
Non,effectivement je l'avais efface parce que je croyais qu'il etait inute puisqu'il se trouve dans la classe Personne. Maintenant tout se compile, mais il ne trouve pas les objets dans le fichier. Faut que je cherche un peu.

Merci
0
Spawn3107 Messages postés 84 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 28 mars 2011
22 mai 2007 à 01:03
Bon, j'ai encore un probleme. Il me charge pas tout l objet et pas dans le bonne ordre .

Mon fichier contient :

MembrePersonnel -->type
1                           -->Id
Albert                   -->Nom
Paul                      -->Prenom
21/5/2007             -->Date de naissance

Et losque j affiche :

Id : -121368121
Nom :
Prenom :
Date :

Il m'affiche rien dans les champs,comme si l enreg n etait pas en memoire.

void Personnel::LirePersonnes()
{
    for(int i=0;i<(int)Vectpersonne.size();i++)
    {
        Vectpersonne[i]->AffichePers();
    }
}

void Personne::AffichePers()
{
    fflush(stdin);
    cout<<"Id : "<<getNum()<<endl;
    cout<<"Nom : "<<getNom()<<endl;
    cout<<"Prenom : "<<getPrenom()<<endl;
    cout<<"Date de naissance : "<<getDate()<<endl;//<<dateNaissance<<endl;
}

+ les fonctions AffichePers des classes derivees.

Est-ce que je dois faire une fonction qui affiche une personne a partir du vecteur et non de la "memoire" ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
22 mai 2007 à 08:56
"Est-ce que je dois faire une fonction qui affiche une personne a partir du vecteur et non de la "memoire" ?" <= je comprend pas.

Mais, c'est juste un pb dans ton code. Montre tes fonctions ReadFromFile, c'est l'ordre dans lequel tu lis les données qui est mauvais. Montre aussi le contenu exact du fichier.
0
Spawn3107 Messages postés 84 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 28 mars 2011
22 mai 2007 à 11:15
Dans personne :

virtual void ReadFromFile(ifstream & _inFile)
    {
       _inFile>>type;       
       _inFile >>num;       
       _inFile>>nom;
       _inFile>>prenom;
       _inFile>>dateTmp;
     }

Dans MembrePersonnel :

virtual void ReadFromFile(ifstream & _inFile)
    {
        Personne::ReadFromFile(_inFile);
       _inFile >>matricule;
    }

Dans mon fichier Personnel.txt :

MembrePersonnel
1
Albert
Paul
21/5/2007
31290
0
Spawn3107 Messages postés 84 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 28 mars 2011
22 mai 2007 à 12:31
Je croiais aussi que c'était mon erreur, mais même en zappant la lecture du type ca donne le même résultat. Moi je crois plutôt que c'est à cause du vecteur.
Losrque j'ajoute une nouvelle personne et que j'affiche directement avec Vectpersonne[i]->AffichePers(); ,ca marche. Parce que les données se trouve qlq part en memoire avec les get(); .
Mais lorsque je charge les données dans le vecteur, au démarage du programme ,j'essaie aussi d'afficher avec Vectpersonne[i]->AffichePers(); , mais là , les données sont seulement dans le vecteur. Donc mes get() sont NULL.
En plus j'initialise pas l' Id (compteur)dans le constructeur,parce qu il est static. Lors de l'affichage il me met Id : -121368121 .

Est-ce que tu as compris?
0
Spawn3107 Messages postés 84 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 28 mars 2011
22 mai 2007 à 13:22
Ben voila, j ' ai trouve l'erreur. J'avais oublié que dans la fonction Load je fait aussi un _inFile >> type; . J'ai remis le pointeur en bonne position et hop, voila qu'il m'affiche les champs.

Encore un grand merci à toi, et peut être a bientôt parce que j' ai pas encore fini l'application.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
22 mai 2007 à 13:31
Oki impec. Par contre, tu feras un nouveau post, continue pas celui la :)
0
Rejoignez-nous