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

Langage C++ Discussion :

Erreur lecture/écriture Objet


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Par défaut Erreur lecture/écriture Objet
    Bonjour !

    J'ai besoin de votre aide pour une erreur que je rencontre lorsque je veux "stocker" un objet dans un fichier.

    Le code est assez simple, je crée un profil, je l'écris sur mon fichier. Ensuite, je veux ré-ouvrir ce même fichier, le lire et afficher le login du profil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main() {
    	Profile p("pazze", "0101", "aure", "blabla", "27/06/1990");
    	File f;
    	f.createFileProfile(p);
    	cout << (f.readFileProfile("pazze")).getLogin() << endl;
    	return 0;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void File::createFileProfile(Profile p) {
    	string name = p.getLogin();
    	int fileProfile ;
    	if ((fileProfile = open(name.c_str(), O_WRONLY | O_TRUNC | O_CREAT ,0700 )) == -1) cout << "File : Erreur dans la création du fichier de profil" << endl;
    	if (write(fileProfile, &p, sizeof(Profile)) == -1) cout << "File : Erreur dans l'écriture du profil" << endl;
    	close(fileProfile);		
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Profile File::readFileProfile(string login) {
    	int fp;
    	Profile q;
    	if((fp = open(login.c_str(), O_RDONLY)) == -1) 
    		cout << "Serveur : Le fichier demandé n'existe pas" << endl;
    	else 
    	if (read (fp, &q, sizeof(Profile)) == -1)
    		cout << "File : Erreur dans la lecture de profil" << endl;
    	close(fp);
    	return q;
    }
    Le message d'erreur que j'obtiens est le suivant (du charabiat pour moi ) :
    *** glibc detected *** ./test: double free or corruption (fasttop): 0x09a8a008 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7ea9604]
    /lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7eab5b6]
    /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb808c231]
    /usr/lib/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1d)[0xb80689fd]
    /usr/lib/libstdc++.so.6(_ZNSsD1Ev+0x51)[0xb806a3b1]
    ./test[0x8048fee]
    ./test[0x804ab94]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7e50775]
    ./test[0x8048a91]
    ======= Memory map: ========
    08048000-0804c000 r-xp 00000000 08:05 737527 /home/aurelien/Bureau/Projet à jour/test
    0804c000-0804d000 r--p 00003000 08:05 737527 /home/aurelien/Bureau/Projet à jour/test
    0804d000-0804e000 rw-p 00004000 08:05 737527 /home/aurelien/Bureau/Projet à jour/test
    09a8a000-09aab000 rw-p 09a8a000 00:00 0 [heap]
    b7d00000-b7d21000 rw-p b7d00000 00:00 0
    b7d21000-b7e00000 ---p b7d21000 00:00 0
    b7e39000-b7e3a000 rw-p b7e39000 00:00 0
    b7e3a000-b7f96000 r-xp 00000000 08:05 3228507 /lib/tls/i686/cmov/libc-2.9.so
    b7f96000-b7f97000 ---p 0015c000 08:05 3228507 /lib/tls/i686/cmov/libc-2.9.so
    b7f97000-b7f99000 r--p 0015c000 08:05 3228507 /lib/tls/i686/cmov/libc-2.9.so
    b7f99000-b7f9a000 rw-p 0015e000 08:05 3228507 /lib/tls/i686/cmov/libc-2.9.so
    b7f9a000-b7f9d000 rw-p b7f9a000 00:00 0
    b7f9d000-b7faa000 r-xp 00000000 08:05 3211397 /lib/libgcc_s.so.1
    b7faa000-b7fab000 r--p 0000c000 08:05 3211397 /lib/libgcc_s.so.1
    b7fab000-b7fac000 rw-p 0000d000 08:05 3211397 /lib/libgcc_s.so.1
    b7fac000-b7fad000 rw-p b7fac000 00:00 0
    b7fad000-b7fd1000 r-xp 00000000 08:05 3228515 /lib/tls/i686/cmov/libm-2.9.so
    b7fd1000-b7fd2000 r--p 00023000 08:05 3228515 /lib/tls/i686/cmov/libm-2.9.so
    b7fd2000-b7fd3000 rw-p 00024000 08:05 3228515 /lib/tls/i686/cmov/libm-2.9.so
    b7fd3000-b80b7000 r-xp 00000000 08:05 6979749 /usr/lib/libstdc++.so.6.0.10
    b80b7000-b80bb000 r--p 000e3000 08:05 6979749 /usr/lib/libstdc++.so.6.0.10
    b80bb000-b80bc000 rw-p 000e7000 08:05 6979749 /usr/lib/libstdc++.so.6.0.10
    b80bc000-b80c2000 rw-p b80bc000 00:00 0
    b80da000-b80dd000 rw-p b80da000 00:00 0
    b80dd000-b80de000 r-xp b80dd000 00:00 0 [vdso]
    b80de000-b80fa000 r-xp 00000000 08:05 3211283 /lib/ld-2.9.so
    b80fa000-b80fb000 r--p 0001b000 08:05 3211283 /lib/ld-2.9.so
    b80fb000-b80fc000 rw-p 0001c000 08:05 3211283 /lib/ld-2.9.so
    bfb9b000-bfbb0000 rw-p bffeb000 00:00 0 [stack]
    Abandon
    un ptit coup de gdb si ça peut aider :
    Program received signal SIGABRT, Aborted.
    0xb80bc430 in __kernel_vsyscall ()
    (gdb) where
    #0 0xb80bc430 in __kernel_vsyscall ()
    #1 0xb7e446d0 in raise () from /lib/tls/i686/cmov/libc.so.6
    #2 0xb7e46098 in abort () from /lib/tls/i686/cmov/libc.so.6
    #3 0xb7e8224d in ?? () from /lib/tls/i686/cmov/libc.so.6
    #4 0xb7e88604 in ?? () from /lib/tls/i686/cmov/libc.so.6
    #5 0xb7e8a5b6 in free () from /lib/tls/i686/cmov/libc.so.6
    #6 0xb806b231 in operator delete () from /usr/lib/libstdc++.so.6
    #7 0xb80479fd in std::string::_Rep::_M_destroy () from /usr/lib/libstdc++.so.6
    #8 0xb80493b1 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string () from /usr/lib/libstdc++.so.6
    #9 0x08048fee in Profile::~Profile ()
    #10 0x0804ab94 in main ()
    L'erreur vient selon moi du read, mais sans aucune certitude. Et surtout, je ne comprend pas pourquoi !


    Vous avez une idée ?

    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Tu peux montrer la classe Profile ? Parce que ce que tu fais, la sérialisation binaire directe, ne marche que dans des cas très simples.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Par défaut
    Voilà :
    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
    /* 
     * File:   profile.hpp
     * Author: sete
     *
     * Created on 16 de febrero de 2010, 20:35
     */
     
    #ifndef _PROFILE_HPP
    #define	_PROFILE_HPP
     
    #include <string>
    #include <cstddef>   // NULL, ptrdiff_t, size_t
    #include <stdexcept> // exception types
    #include <iostream>
    using namespace std;
     
     
    class Profile {
    private:
        string login;
        string password;
        string name;
        string surname;
        string birthDate;
        string city;
        string country;
        string highSchool;
        string university;
     
    public:
        Profile(){};
        Profile(string l, string p, string n, string sn, string bd);
        Profile(string l, string p, string n, string sn, string bd, string c, string ct, string un, string hs);
        Profile(string prof);
    	~Profile() {}
     
        string getLogin() {return login;}
        void load(string p);
    };
     
     
    #endif	/* _PROFILE_HPP */

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,

    il aurait fallut mettre non pas la déclaration de la classe mais la définition du destructeur car comme le montre le backtrace sous gdb c'est là qu'est le problème, le destructeur appelant visiblement delete sur une string

    à tout hasard, si ~Profile fait delete &login; ou autre destruction d'un des membres alors ce n'est pas la peine de chercher plus loin ...
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    write(fileProfile, &p, sizeof(Profile)) et read (fp, &q, sizeof(Profile)) ça ne marche pas car std::string contient un buffer dynamique pour la chaine de caractère. Tu peux soit utiliser les flux en mode texte et faire une sauvegarde/lecture avec les opérateurs << et >>. Ou si tu veux une sauvegarde binaire, alors il faut que tu regardes du côté des outils de sérialisation (boost serialize par expl).

  6. #6
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    je n'avais pas vu que read&write n'étaient pas redéfinis pour Profile, bel écrasement mémoire
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/03/2015, 18h11
  2. Erreur d'accès en lecture/écriture à un fichier Excel !
    Par Mistraldor dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 17/08/2011, 14h39
  3. Lecture / écriture d'objets sur le disque dur ?
    Par miria.vhg dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 06/02/2007, 15h21
  4. librairie introuvable! Erreur"Pas d'objet dans ce contr
    Par vins111282 dans le forum Access
    Réponses: 5
    Dernier message: 16/05/2005, 14h07
  5. erreur à l'écriture avec SQL
    Par Homer dans le forum ASP
    Réponses: 5
    Dernier message: 07/02/2005, 14h03

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