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 :

[Problème] sauvergarde pile dans un fichier binaire


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [Problème] sauvergarde pile dans un fichier binaire
    Bonjour je voudrai mettre à jour un composant que j'ai recoder en y intégrant la possibilité de sauvergarder une pile complète (pile + contenu), mais je n'y arrive pas.

    voila mon composant de pile

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #include <fstream>
    #include <iostream>
    using namespace std;
    #include "Pile.hpp"
     
    /**
     * @brief Créer une pile vide
     * la pile est allouée en mémoire dynamique
     * elle est à désallouer (cf. detruire) en fin d’utilisation
     * @param[in,out] p : la pile à créer (vide)
     * @param[in] c : capacité de la pile (nb maximum d‘items stockés)
     * @pre aucune (la pile peut déjà être crée ou non)
     * @post p est vide  
     */
    void creer(Pile& p, unsigned int c) {
    	p.tab = new Item[c];
    	p.sommet = -1;
    	p.capacite = c;
    }
     
    /**
     * @brief Agrandir la pile
     * la pile est allouée en mémoire dynamique
     * elle est à désallouer (cf. detruire) en fin d’utilisation
     * @param[in,out] p : la pile à agrandir(pleine)
     * @param[in] c : capacité de la pile (nb maximum d‘items stockés)
     * @pre aucune (la pile doit etre pleine)
     * @post p est pleine  
     */
    void agrandir(Pile & p, unsigned int c) {
    	Item* newItem;
    	p.capacite++;
    	newItem = new Item[p.capacite];
     
    	for(unsigned int i=0; i < p.capacite; i++) {
    		newItem[i]= p.tab[i];
    	}
     
    	detruire(p);
    	p.tab = newItem;
    	p.capacite++;
     
    }
    /**
     * @brief Désallouer une pile
     * la pile a été créée (cf. creer)
     * @param[in,out] p : la pile concernée
     */
    void detruire(Pile& p) {
    	delete [] p.tab;
    	p.tab = NULL;
    }
     
    /**
     * @brief Test de pile pleine
     * la pile a été créée (cf. creer)
     * @param[in] p : la pile testée
     * @return true si p est pleine, false sinon
     */
    bool estPleine(const Pile& p) {
    	return (p.sommet == (p.capacite-1));
    }
     
    /**
     * @brief Test de pile vide_ 
     * la pile a été créée (cf. creer)
     * @param[in] p : la pile testée
     * @return true si p est vide, false sinon
     */
    bool estVide(const Pile& p) {
    	return (p.sommet == -1);
    }
     
    /**
     * @brief Lire l'item au sommet de la pile_ * la pile a été créée (cf. creer)
     * @param[in] p : la pile concernée
     * @return la valeur de l'item au sommet de pile
     * @pre la pile n’est pas vide
     */
    Item sommet(const Pile& p) {
    	return p.tab[p.sommet];
    }
     
    /**
     * @brief Empiler un item sur la pile
     * la pile a été créée (cf. creer)
     * @param[in,out] p : la pile concernée
     * @param[in] it : l'item à empiler
     * @pre p n’est pas pleine
     * @post p n’est pas vide, it est le sommet de p
     */
    void empiler(Pile& p, Item it) {
    	if(!estPleine(p)) {
    		agrandir(p, 1);
    	}
    	p.sommet++;
    	p.tab[p.sommet] = it;
    }
     
    /**
     * @brief Dépiler l’item sommet de pile
     * la pile a été créée (cf. creer)
     * @param[in,out] p : la pile concernée
     * @pre p n’est pas vide
     */
    void depiler(Pile& p) {
    	assert(!estVide(p));
    	p.sommet--;
    }
    et voila les deux nouvelle fonction que je voudrai intergrer pour sauvegarder mes piles dans des fichiers binaire.

    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
    /**
     * @brief sauvegarder les elements de la pile dans un fichier
     * @param[in,out] p : la pile concernée
     * @pre p est good
     */
    void ecrireFB(ofstream& fe, const Pile& p) {
    	if(!fe.fail()) {
    		fe.write((char*)&p, sizeof(Pile));
    	}
    }
     
    /**
     * @brief lecture des elements de la pile dans un fichier
     * @param[in,out] p : la pile concernée
     * @pre p est good
     */
    void lireFB(ifstream& fl, Pile& p) {
    	if(!fl.fail()) {
    		fl.read((char*)&p, sizeof(p));
    	}
    	else {
    		cout << "Le fichier est corompu." << endl;
    		exit(1);
    	}
    }
    pourriez vous m'indiquer comment m'y prendre pour faire une sauvegarde de mes pile dnas un fichier binaire, et pour ensuite leslire SVP

    merci d'avance bonne journée

  2. #2
    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
    Tu ne peux pas sauvegarder les données internes de ta pile de manière brute comme tu voudrais le faire. Tu aurais dans ton fichier quelques entiers dont un qui représente une adresse mémoire, ce qui ne t'aiderait pas beaucoup à recharger ta pile.

    Il écrire les données de ta pile une à une dans le fichier, notamment parcourir ton tableau d'éléments et les sauvegarder un à un également.

    PS : pourquoi une interface à base de fonctions libres alors que tu as une belle classe Pile ?

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Parce que c'est mieux ainsi ? Et en plus, il pourrait même surcharger << et >> pour lire et écrire une pile à partir d'un flux

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    si j'ai bien compris il faut je dépile et que je sauvegarde à chaque fois le sommet de la pile dans le fichier binaire?

    sinon j'utilise mon propre composant pile car je suis étudiant et qu'ils nous ont simplement demandé de le recodé

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu peux, mais sans "vraiment" dépiler (la sauvegarde ne doit pas modifier le vrai état de la pile).
    Et attention lors du chargement à ne pas te tromper de sens: La pile chargée doit être dans le même état que la pile de départ, pas en sens inverse...

    PS: Ton orthographe est déplorable et certaines fautes seraient repérées par un simple correcteur orthographique comme celui de Word..;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Problème d'écriture dans un fichier en mode binaire
    Par Linkht dans le forum Général Python
    Réponses: 6
    Dernier message: 11/08/2011, 03h41
  2. [Débutant] Problème d'écriture dans un fichier binaire.
    Par katmai dans le forum C#
    Réponses: 1
    Dernier message: 10/07/2011, 20h39
  3. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  4. Réponses: 2
    Dernier message: 01/06/2004, 12h47
  5. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30

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