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

C++ Discussion :

Sauvegarde dans un fichier et mise à jour


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Par défaut Sauvegarde dans un fichier et mise à jour
    Bonjour,
    J'ai un problème avec une sauvegarde de données dans un fichier texte.
    J'ai créé une fonction "sauvegarder" pour écrire les données dans un fichier texte. De façon à pouvoir trouver la fin du fichier (ne pouvant pas utiliser eof() ), j'ai introduit un entier n qui compte le nombre d'éléments présents dans le tableau. Cependant, je ne vois pas comment mettre à jour cet entier (c'est à dire l'effacer et le remplacer par "n + nouveau n".
    Voici le code auquel j'ai pensé :

    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
     
    void Tableau::sauvegarder(string nom_fichier) const{
           fstream fichier(nom_fichier.c_str(), ios::in | ios::out | ios::ate); 
         int j=0; 
         if(fichier) {
                    map<Personne,string>::const_iterator it;
     
     
                    for ( it=M.begin() ; it != M.end(); it++ ) {
                        j=j+1;
                        }
     
     
                    for ( it=M.begin() ; it != M.end(); it++ ) {
                        fichier << (*it).first;
                        fichier << (*it).second << endl;
                        }
     
                     fichier.seekp(0,ios::beg); //repositionnement du curseur
                     int entier1;
                      entier1 = entier1 + j;
                    fichier << entier1 << endl;
                     fichier >> entier1 ;  
                                     }
         else 
              cerr << "Impossible de sauvegarder les donnees dans le fichier ! " << endl;
    }
    Pour info : M est une map et Tableau est une classe
    Comment faire pour mettre à jour cet entier et ainsi pouvoir copier des données à la suite du fichier et les récupérer sans problème ?

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Le plus simple est probablement

    - de lire le fichier de départ (et de le charger en mémoire),
    - d'y ajouter les données
    - de tout récrire

    A moins que le fichier soit gigantesque (et là, il faut te poser la question de la validité de ce type de sauvegarde séquentielle), ca ira plus vite...

    Quelques remarques sur ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( it=M.begin() ; it != M.end(); it++ ) {j=j+1;}
    plutôt j=M.size();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    for ( it=M.begin() ; it != M.end(); it++ ) {
                        fichier << (*it).first;
                        fichier << (*it).second << endl;
                        }
    je pense qu'il te faut un séparateur... (sauf si la surcharge de << l'ajoute déjà)

    Donc, en gros :

    1- tu ouvres le fichier d'origine,
    2- tu lis sa longueur, tu lui ajoute la taille de ta map, et tu l'écris dans le fichier de sortie.
    3- Tu recopies telle quelle la suite du fichier d'origine (copy(), or si c'est gros des trucs avec rdbuf(), ou une fonction à cette effet de ton framework)
    4- Tu fais recopies la map (avec la boucle que tu as écrite tout à l'heure)
    5- Tu effaces la sauvegarde précédente, et tu renommes la nouvelle (tu peux même te permettre le luxe de faire un backup...)

    Francois

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Par défaut
    Merci pour les corrections et les explications.
    Mais je ne vois pas comment faire dans ce cas pour la première fois lorsque je copie dans un fichier vide. ????

  4. #4
    Invité
    Invité(e)
    Par défaut
    Facile, on saute la première étape !

    En fait, tu avais écrit presque tout le code... Si le fichier est absent, on ne va pas ajouter de longueur à la taille de la map, et on ne va rien recopier dans le fichier de sortie... Et tout ira bien.

    Donc quelque chose comme

    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
     
    ofstream fres(sortie);
    ifstream fdat(monfichier);
    int nbrec=0;
    vector<elem> v;
    if(fdat) {
      fdat>>nbrec;
      v.resize(nbrec);
      for(int i=0;i<nbrec;i++) fdat>>v[i];
    }
    int nbtot=nbrec+M.size();
    fres<<nbtot<<endl;
    for(int i=0;i<nbrec;i++) fres<<v[i]<<endl;
    vector<elem>::iterator it;
    for(it=M.begin();ut!=m.end();it++) fres<<*it<<endl;
    Francois

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

Discussions similaires

  1. Comment ecrire dans un fichier en mise à jour
    Par Nkouka dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 17/10/2006, 20h08
  2. Sauvegarder dans un fichier en C
    Par Gryzzly dans le forum C
    Réponses: 10
    Dernier message: 14/12/2005, 16h07
  3. Réponses: 6
    Dernier message: 29/11/2005, 19h36
  4. Réponses: 2
    Dernier message: 16/06/2005, 14h48
  5. [JList] Lecture des données sauvegardées dans un fichier
    Par Myogtha dans le forum Composants
    Réponses: 7
    Dernier message: 10/06/2004, 21h05

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