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 de lecture fichier Binaire!


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 62
    Points : 34
    Points
    34
    Par défaut Probléme de lecture fichier Binaire!
    Bonjour.

    j'ai un problème de plantage lors de certaine lecture de fichier binaire.

    Je précise que j'utilise Qt pour créer mes fenêtres.

    Mon but est d'inscrire dans un fichier binaire, des fiches contenant le pseudo et le mot de pass de l'utilisateur et ensuite d'afficher le contenu du fichier binaire fiche par fiche.

    Pour ce faire j'ai d'abord une fenêtre avec 2 boutons:
    le bouton "S'INSCRIRE"
    le bouton "Lire Fichier fiche par fiche"

    lorsque je clic sur "S'inscrire" : une nouvelle fenêtre apparais avec

    2 QLineEdit (Pseudo, mot de pass) et un bouton "Inscrire" pour enregistrer pseudo et mot de pass dans fichier binaire.

    L'enregistrement dans le fichier binaire se fait très bien!

    Mais lorsque je reviens vers ma 1ere fenêtre pour afficher le contenu de mon fichier binaire fiche par fiche en cliquant sur "Lire Fichier fiche par fiche".

    Il affiche correctement mes fiches dans un premier temps Si ET SEULEMENT SI j'inscrit une fiche à la fois.

    je m'explique :

    je clic sur "S'inscrire" : fenêtre Inscription s'ouvre.
    j'écris mon pseudo et mot de pass.
    je clic sur "Inscrire" puis ferme la fenêtre Inscription.
    //puis je recommence si je veux inscrire d'autre utilisateur


    Et lorsque je reclic sur "Lire Fichier fiche par fiche" , La lecture de mon fichier plante lors de l'affichage de la dernière fiche!!!

    une fois planter , je suis obligé de supprimer mon fichier binaire pour continuer mes test.

    Pourquoi????

    De plus lorsque je clic sur "Lire Fichier fiche par fiche" après avoir Inscrit plusieurs utilisateur sans fermer la fenêtre Inscription a chaque fois comme défini avant, La lecture fiche par fiche plante directement sans afficher quoi que se soit!!!

    Pourquoi???

    Voici mes bout de code si besoin:

    //Ma_fenetre.cpp

    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
     
     
    {
            .................
            QObject::connect(bouton1, SIGNAL(pressed()),this, SLOT(test1()));    
            QObject::connect(bouton2, SIGNAL(pressed()),this, SLOT(test2()));
            ...............
    }
    void MaFenetre::test1()
    {
     
        Inscriptions_Joueurs *test1 = new Inscriptions_Joueurs();
        test1->exec();
    }
     
    void MaFenetre::test2()
    {
        QString pseudo = lineEdit1->text();
        QString passWord = lineEdit2->text();
     
        Deja_Joueurs(pseudo,passWord);
    }
    //Inscription.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     
    {
         .............
         connect(Inscrire, SIGNAL(clicked()), this, SLOT(inscription_fichier()));
    }
    void Inscriptions_Joueurs::inscription_fichier()
    {
        QString pseudo = lineEdit1->text();
        QString passWord = lineEdit2->text();
        Engregistrement_Joueurs (pseudo , passWord);
    }

    //Enregistrement.cpp

    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
     
     
    using namespace std;
     
    Engregistrement_Joueurs::Engregistrement_Joueurs(QString pass1,QString pass2) : QDialog()
    {
            FILE *file1;
            FICHE_J fich;
            file1=fopen("Fichier_J.bin","a+b");
            if(!file1)
            {
                QMessageBox::critical(this, "Erreur", "Ouverture fichier impossible");
                return; // Arrêt de la méthode
            }
            QString str;
            //Saisir fiche
            fich.Pseudo = pass1;
            fich.PassWord = pass2;   
            fseek(file1,0,SEEK_END);
            QMessageBox::critical(this, "Erreur", str.setNum(ftell(file1)/sizeof(FICHE_J)));
            fwrite(&fich,sizeof(fich),1,file1);
            QMessageBox::critical(this, "Erreur", str.setNum(ftell(file1)/sizeof(FICHE_J)));
            if(ferror(file1))QMessageBox::critical(this, "Erreur", "Erreur de lecture..." );
     
            fclose(file1);
     
    }
     
    Deja_Joueurs::Deja_Joueurs( QString pass1,QString pass2) : QDialog()
    {
        int nb_fiches,nb_pos,i,j=0;
        FICHE_J fich;
        FILE *file1;
        file1=fopen("Fichier_J.bin","rb");
        if(!file1)
        {
            QMessageBox::critical(this, "Erreur", "Ouverture fichier impossible");
            return; // Arrêt de la méthode
        }
        QString str;
        fseek(file1,0,SEEK_END);
        nb_fiches = ftell(file1)/sizeof(FICHE_J);
        QMessageBox::critical(this, "Erreur", str.setNum(nb_fiches));
        fseek(file1,(0)*sizeof(FICHE_J),SEEK_SET);
     
        /* Lire le fichier enregistrement par enregistrement */
        i=0;
        while (i!=nb_fiches)
        {
            fread(&fich,sizeof(fich),1,file1);
            //Afficher fiche
            QMessageBox::critical(this, "Erreur", fich.Pseudo );
            QMessageBox::critical(this, "Erreur", fich.PassWord );
     
             i++;
        }
     
        if(ferror(file1))QMessageBox::critical(this, "Erreur", "Erreur de lecture..." );
     
        fclose(file1);
     
    }
    //Enregistrement.h

    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
     
     
    class Engregistrement_Joueurs : public QDialog
    {
         Q_OBJECT
     
            public:
                    typedef struct FICHE_J{
                        QString Pseudo;
                        QString PassWord;
                    }FICHE_J;
     
            public:
                    Engregistrement_Joueurs(QString ,QString);
     
    };
     
    class Deja_Joueurs : public QDialog
    {
         Q_OBJECT
     
            private:
                    typedef struct FICHE_J{
                        QString Pseudo;
                        QString PassWord;
     
                    }FICHE_J;
     
            public:
                    Deja_Joueurs(QString ,QString);
     
    };
    J'ai utiliser mes vieux bout de code en C pour lire et écrire dans mon fichier binaire.

    Si quelqu'un peut me fournir une piste de réflection pour trouver mon probléme de lecture des mes fiches, ce serrais sympa car ça fais 2 jours que j'essaye de lire correctement mon fichiér binaire, mais pas moyen!

    Merci

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Salut,

    Est ce que tu es sur que ta structure de fiche a une taille constante ? Parce que comme elle contient des QString, qui ne contiennent pas forcément le même nombre de caractères, il y'a peut être un problème à ce niveau.

    Sinon, meme si le problème ne vient pas de la, ceci est étrange :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(file1,(0)*sizeof(FICHE_J),SEEK_SET);
    (0)*sizeof(FICHE_J) = 0

    Pour tester, je prendrais une structure fiche dont je suis sur de la taille, quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct FICHE_J{
                        char Pseudo[256];
                        char PassWord[256];
                    }FICHE_J;
    Sinon, il doit exister dans Qt des méthodes de sérialisation ou de marshalling, pour stocker n'importe quel objet de façon sure.
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 62
    Points : 34
    Points
    34
    Par défaut
    Merci pur cette suggestion Le Mérovingien.

    fseek(file1,(0)*sizeof(FICHE_J),SEEK_SET);
    C'st vrai que c'est étrange d'écrire cela comme ça,
    mais je l'avais écris ainsi pour tester la position du énième enregistrement.

    j'aurrais du l'écrire ainsi mais cela revient au meme:

    fseek(file1, 0, SEEK_SET);

    Sinon je pense que tu as raison pour l'enregistrement de ma structure FICHE_J de taille variable effectivement.

    Je vais tester cela de suite ,je vous tiens au courant dés que possible.

    Et encore merci.

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Tu sembles mélanger Qt et STL (voire C), pourquoi ne pas utiliser simplement Qt ? Il y a des flux très pratique à mettre en oeuvre et qui devraient régler automatiquement pas mal de tes problèmes.

    http://qt.developpez.com/doc/4.5/qdatastream/

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 62
    Points : 34
    Points
    34
    Par défaut Probléme fichier binaire résolu
    Problème résolu!!!

    Alors comme prévu j'annonce la correction.

    Il fallait effectivement déclaré les variables de ma structure "FICH_J avec des taille fixe comme défini par "Le Mérovingien"

    De plus j'ajoute que suite a cette modification, il m'a fallu convertir mes variables QString pass1et pass2 en char[X].

    pour ce faire j'ai du écrire ceci à la plce de

    devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(fich.Pseudo,pass1.toStdString().c_str());

    Et merci pour tout

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Parfait,

    fais tout de meme attention à ne pas avoir de chaine plus grande que la taille de ton tableau, sinon il y'a comportement indéterminé d'après la doc (dépassement de mémoire, segfault, etc).
    Regardes du coté de strncpy pour régler ça.

    Si tu veux rester en C++, avec la STL tu as std::string::copy qui peut aider.
    Avec Qt, il y'a forcément quelque chose d'équivalent, mais je ne connais pas.

    @+
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

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

Discussions similaires

  1. Problème lecture fichier binaire
    Par santino2008 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 19/03/2010, 19h13
  2. problème ecriture et lecture fichier binaire
    Par gonzo59 dans le forum C++
    Réponses: 5
    Dernier message: 16/04/2009, 20h02
  3. [debutant] problème lecture fichier binaire
    Par julien.63 dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2007, 22h12
  4. Lecture fichier binaire
    Par gabule dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/05/2006, 15h53
  5. problème de lecture fichier
    Par Polo40 dans le forum C
    Réponses: 8
    Dernier message: 30/03/2006, 10h58

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