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
//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
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); }
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
//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
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); }
J'ai utiliser mes vieux bout de code en C pour lire et écrire dans mon fichier 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
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); };
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
Partager