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 :

Sauvegarde std::map dans un fichier


Sujet :

SL & STL C++

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Points : 56
    Points
    56
    Par défaut Sauvegarde std::map dans un fichier
    Bonjour a tous,

    voila je travaille actuellement sur une structure de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef vector<vector<float> > Array2D;
     
    map<string, Array2D> Files;
    donc je fait tous les traitements que j'ai a faire dessus etc. A la fin de mes traitements la map est fixée et normalement je n'y touche plus. J'ai besoin de la sauvegarder de facon permanente afin de pouvoir y acceder par la suite depuis d'autres programmes. Seulement la je seche. Auriez vous une methode a me conseiller ou meme une autre facon de faire, le fait de passer par un fichier n'est peut etre pas la bonne solution...

    Merci d'avance.

    PS : je ne sais pas si ca joue mais la taille de la map est relativement consequente : environ 48*5 strings de 1000*128 array2D.

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    le choix memoire morte/vive se fait sur l'hypothese suivante: si ton application ayant rempli la map peut etre terminé alors que les autres application clients aurons besoin de la map, --> memoire morte sinon memoire vive.

    ensuite la manière de stocker en memoire morte peut etre la suivante : rediriger ta map vers un ostream/ofstream
    Pour les details, cherche tout seul !

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

    Informations professionnelles :
    Activité : aucun

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

    Si tu es libre du point de vue du format, je me tournerais volontiers vers une des solutions suivantes:

    Soit, toutes les lignes contiennent le meme nombre d'éléments, et, dans ce cas, on indiquerait simplement le nombre de lignes et de colones sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //création d'un flux en écriture de fichier
    std::ofstream ofs("sauvegarde.txt");
    //la premiere ligne contient le nombre de lignes et le nombre de colones
    ofs<< mamap.size()<<" "<<mamap[0].size()<<std::endl;
    for(unsigned int i=0;i<mamap.size();i++)
    {
        for(unsigned int j=0;j<mamap[i].size();j++)
        {
            ofs<<mamap[i][j]<<" ";
        }
        ofs<<std::endl;
    }
    et la lecture se fait sous la forme d'un
    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
     
    //création d'un flux en lecture du fichier
    std::ifstream ifs("sauvegarde.txt");
    unsigned int lignes;
    unsigned int colones;
    //lecture du nombre de lignes et du nombre de colones
    ifs>>lignes>>colones;
    //déclaration de la map
    std::vector<std::vector<float> > tab;
    //boucle qui s'occupe de gérer les lignes
    for(unsigned int i=0;i<lignes;i++)
    {
         // un tableau de float temporaires ;)
         std::vector<float> temp;
        //boucle qui s'occupe de gérer les colones
        for(unsigned int j=0;j<colones;j++)
        {
            float f;
            ifs>>f;
            temp.push_back(f);
        }
        // on a lu toutes les colones de la ligne, on peut l'insérer dans la
        // matrice
        tab.push_back(temp);
    }
    Soit, le nombre de colones est différent en fonction de la ligne en cours de la matrice, et il faut donc indiquer, pour chaque lignes, combien de colones doivent etre lue...

    A l'écriture, cela donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    std::ofstream ofs("sauvegarde.txt");
    //la premiere ligne contient le nombre de lignes
    ofs<< mamap.size()<<std::endl;
    for(unsigned int i=0;i<mamap.size();i++)
    {
        // écriture du nombre de colones de la ligne
        ofs<<mamap[i].size();
        for(unsigned int j=0;j<mamap[i].size();j++)
        {
            ofs<<mamap[i][j]<<" ";
        }
        ofs<<std::endl;
    }
    et en lecture
    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
     
    //création d'un flux en lecture du fichier
    std::ifstream ifs("sauvegarde.txt");
    unsigned int lignes;
    //lecture du nombre de lignes
    ifs>>lignes
    //déclaration de la map
    std::vector<std::vector<float> > tab;
    //boucle qui s'occupe de gérer les lignes
    for(unsigned int i=0;i<lignes;i++)
    {
         // un tableau de float temporaires ;)
         std::vector<float> temp;
        //boucle qui s'occupe de gérer les colones
        //lecture du nombre de colones
        unsigned int colones;
        ifs>>colones;
        for(unsigned int j=0;j<colones;j++)
        {
            float f;
            ifs>>f;
            temp.push_back(f);
        }
        // on a lu toutes les colones de la ligne, on peut l'insérer dans la
        // matrice
        tab.push_back(temp);
    }
    Le fichier résultant serait, dans le premier cas, du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    3 5
    0.2158 0.4448 0.66698 0.8888777 2.8721
    ...(chaque fois 5 valeurs ;))
    ...
    (ou le 3 représente le nombre de lignes et le 5 le nombre de colones)
    et dans le second du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    3
    5 0.2158 0.4448 0.66698 0.8888777 2.8721
    2 5.89666 4.888
    4 3.0245 2.0368 1.55580 4.77741
    (ou le 3 du début représente le nombre de lignes et où le premier nombre de chaque ligne représente celui des colones de la lignes )

    Simple et efficace... meme s'il est possible de compresser le code sous la forme d'un std::copy, par exemple
    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

  4. #4
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup a vous deux et surtout a Koala01 de m'avoir meme propose un code desole de ne pas avoir repondu plus rapidement mais hier c'etait ferie

    Sur ce je vais tester le code avant de mettre ce post en Resolu [Meme si je ne doute pas que ce soit le cas dans quelques minutes ]

    - Edit - Oops je viens de m'apercevoir que j'avais un gros pb dans mon prog, je doit regler ca avant. Je pense tester la sauvegarde dans la journee.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Points : 56
    Points
    56
    Par défaut
    Impeccable ca marche nikel merci a toi Koala01, j'ai juste une derniere question : est-il possible d'ouvrir le fichier de sauvegarde en ajout (ca m'arrangerais beaucoup xD) ?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    est-il possible d'ouvrir le fichier de sauvegarde en ajout
    Oui, jette un oeil aux options que tu peux passer en second paramètre du constructeur de ofstream (genre ios::app).

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Points : 56
    Points
    56
    Par défaut
    Teste & approuve. Merci a tous.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Heuu... sois juste attentif au fait que, si tu fais un ajout, le nombre de lignes risque de ne plus correspondre... (si tu utilise mon idée de "fournir" ce nombre de lignes)

    Par contre, si tu envisage l'utilisation de plusieurs matrices différentes, cela peut se traduire, au final, par un fichier du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    3 5 (il y a trois lignes de cinq colones dans la premiere matrice)
    contenu de la premiere ligne
    contenu de la deuxieme ligne
    contenu de la troisieme ligne
    5 5 (la deuxieme matrice est composée de 5 lignes de 5 colones
    ...
    ...
    ...
    ...
    ...
    6 10
    ...
    Si tu veux que ta matrice, qui était à l'origine de 5 par 5 devienne une matrice de 10 par 5 (ou pire, de 10 par 10), il ne s'agira pas de se contenter d'ajouter les valeurs dans le fichier, il faudra quarément le réécrire entierement

    Ou, du moins, dans toute autre hypothese que celle qui voudrait que
    • tu sache dés le départ que ta matrice fera 10 par 10 mais
    • tu va remplire les lignes les unes apres les autres, et tu voudrais les écrire dans ton fichier au fur et à mesure...
    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

  9. #9
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Points : 56
    Points
    56
    Par défaut
    Oui merci Koala01 effectivement j'ai du trouver une solution mais qui est au final toute simple : vu que j'ai une matrice par fichier que je traite, j'ai rajoute un niveau de vecteur afin d'avoir chaque matrice associee au nom de fichier, lorsque je sauvegarde, cela me donne quelque chose de style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    titi.jpg 100 //100 vecteurs de vecteurs dans le fichier titi.jpg
    14 132 //14 vecteurs de 132 float dans le vecteur de vecteurs [0]
    //1er vecteur de float
    //2eme vecteur de float
    //etc
    7 132 //7 vecteurs de 132 float dans le vecteur de vecteurs [1]
    //etc
    toto.jpg 150 //150 vecteurs de vecteurs dans le fichier de nom toto.jpg
    //...
    //...
    Le seul truc que je n'ai pas encore teste c'est de lire fichier par fichier dans la sauvegarde, mais je ne pense pas que ce soit un probleme .
    En tout cas merci encore, c'est parfait ^-^

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/10/2005, 11h48
  2. [C#] Sauvegarde de texture dans un fichier + transparence
    Par Harry_polin dans le forum DirectX
    Réponses: 13
    Dernier message: 23/07/2005, 18h12
  3. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 13h30
  4. [arbre] Sauvegarder un objet dans un fichier
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 00h55
  5. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 15h23

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