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

GTK+ avec C & C++ Discussion :

Lire et écrire dans un fichier


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Par défaut Lire et écrire dans un fichier
    bonjour les amis. je suis nouveau sur le forum de developpez.com et j'ai vraiment un très grand problème avec mon code C/GTK+..
    tout d'abord je crée une fenêtre dans lequel se trouve 3 entry et deux bouton. je récupère les informations de l'utilisateur pour aller les placer dans le fichier.Mais voila je ne comprend pas pourquoi le programme bug..donc si quelqu'un pourrait m'aider ,je lui serait vraiment reconnaissant. merci d'avance
    voici tout le code avec les deux fonctions
    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
    typedef struct
    {
        const gchar *nom;
        const gchar *prenom;
        const gchar *telephone;
    }personne;
     
        void mettreFichier(GtkWidget *widget,gpointer data);
        void LireFichier(GtkWidget *widget,gpointer data);
        static GtkWidget *pLabel1;
        static GtkWidget  *pEntry1;
        static GtkWidget *pLabel2;
        static GtkWidget  *pEntry2;
        static GtkWidget *pLabel3;
        static GtkWidget  *pEntry3;
        static personne Client;
     
    FILE *fichier;
    int main(int argc,char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pVBox;
     
        GtkWidget *Valider;
        GtkWidget *AfficherListe;
     
        gtk_init(&argc,&argc);
     
        pWindow =gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_position(GTK_WINDOW(pWindow),GTK_WIN_POS_CENTER);
        gtk_window_set_default_size(GTK_WINDOW(pWindow),320,200);
        gtk_window_set_title(GTK_WINDOW(pWindow),"contact telephonique");
     
        g_signal_connect(G_OBJECT(pWindow),"destroy",G_CALLBACK(gtk_main_quit),NULL);
     
        pVBox =gtk_vbox_new(FALSE,0);
        gtk_container_add(GTK_CONTAINER(pWindow),pVBox);
     
        pLabel1 = gtk_label_new("Nom");
        gtk_box_pack_start(GTK_BOX(pVBox),pLabel1,TRUE,FALSE,0);
        pEntry1 = gtk_entry_new();
        gtk_box_pack_start(GTK_BOX(pVBox),pEntry1,TRUE,FALSE,0);
     
        pLabel2 = gtk_label_new("Prenom");
        gtk_box_pack_start(GTK_BOX(pVBox),pLabel2,TRUE,FALSE,0);
        pEntry2 = gtk_entry_new();
        gtk_box_pack_start(GTK_BOX(pVBox),pEntry2,TRUE,FALSE,0);
     
        pLabel3 = gtk_label_new("Telephone");
        gtk_box_pack_start(GTK_BOX(pVBox),pLabel3,TRUE,FALSE,0);
        pEntry3 = gtk_entry_new();
        gtk_box_pack_start(GTK_BOX(pVBox),pEntry3,TRUE,FALSE,0);
     
        Valider =gtk_button_new_with_label("Valider");
        gtk_box_pack_start(GTK_BOX(pVBox),Valider,TRUE,FALSE,0);
        AfficherListe =gtk_button_new_with_label("AfficherListe");
        gtk_box_pack_start(GTK_BOX(pVBox),AfficherListe,TRUE,FALSE,0);
     
        g_signal_connect(G_OBJECT(Valider),"clicked",G_CALLBACK(mettreFichier),NULL);
        g_signal_connect(G_OBJECT(AfficherListe),"clicked",G_CALLBACK(LireFichier),NULL);
        gtk_widget_show_all(pWindow);
        gtk_main();
     
     
     
        return EXIT_SUCCESS;
     
     
    }
    void mettreFichier(GtkWidget *widget,gpointer data)
    {
     
        Client.nom =gtk_entry_get_text(GTK_ENTRY(pEntry1));
        Client.prenom =gtk_entry_get_text(GTK_ENTRY(pEntry2));
        Client.telephone =gtk_entry_get_text(GTK_ENTRY(pEntry3));
        fichier =fopen("monfichier.bin","ab+");
        if(fichier!=NULL)
        {
     
            fwrite(&Client,sizeof(Client),1,fichier);
            gtk_main_quit();
            fclose(fichier);
        }
    }
    void LireFichier(GtkWidget *widget,gpointer data)
    {
        GtkWidget *fenetre;
        GtkWidget *pVBox;
        GtkWidget *OK1;
        GtkWidget *pLabell1;
        gchar *nom;
        GtkWidget *pLabell2;
        GtkWidget *pLabell3;
        GtkWidget *pLabell4;
     
        fenetre =gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_position(GTK_WINDOW(fenetre),GTK_WIN_POS_CENTER);
        gtk_window_set_default_size(GTK_WINDOW(fenetre),320,200);
        gtk_window_set_title(GTK_WINDOW(fenetre),"Liste des contact telephonique");
     
        g_signal_connect(G_OBJECT(fenetre),"destroy",G_CALLBACK(gtk_main_quit),NULL);
     
        pVBox =gtk_vbox_new(FALSE,0);
        gtk_container_add(GTK_CONTAINER(fenetre),pVBox);
     
        fichier = fopen("monfichier.bin" , "rb+");
        rewind(fichier);
     
        while(fread(&Client,sizeof(Client),1,fichier)!=NULL)
        {
     
                nom = g_strdup_printf("Nom: %s",Client.nom);
                pLabell1 = gtk_label_new(nom);
                gtk_box_pack_start(GTK_BOX(pVBox),pLabell1,TRUE,FALSE,0);
                g_free(nom);
        }
        fclose(fichier);
     
        OK1 =gtk_button_new_with_label("ok");
        gtk_box_pack_start(GTK_BOX(pVBox),OK1,TRUE,FALSE,0);
     
        g_signal_connect(G_OBJECT(OK1),"clicked",G_CALLBACK(gtk_main_quit),NULL);
        gtk_widget_show_all(fenetre);
        gtk_main();
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Tout d'abord il ne faut pas "parler" si fort. Ton message doublon à 09h03 avec un titre en MAJUSCULE, ca a tendance à irriter les plus sensibles d'entre-nous .

    Ceci étant dit, passons un peu à ton code. Comme première réponse le code gtk_init(&argc,&argc); comporte une erreur d'écriture. Ca m'étonne que ton compilateur ne te l'ai pas signalé !

    Ensuite à la ligne while(fread(&Client,sizeof(Client),1,fichier)!=NULL) tu compares le retrour de fread(); à NULL. Ce n'est pas correcte. À la limite il faut le comparer au nombre d'éléments que tu désires lire : ici 1. Donc il vaut mieux écrire while(fread(&Client,sizeof(Client),1,fichier)==1).

    Pour finir avec les messages émis par le compilateur les trois variables suivantes ne servent à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GtkWidget *pLabell2;
    GtkWidget *pLabell3;
    GtkWidget *pLabell4;
    Je vais maintenant regarder le principe de ton code pour voir où se trouve le problème...

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Je continue sur le côté "propre" du code. Le prototype du callback pour le signal "clicked" est void user_function (GtkButton *button, gpointer user_data); et non void user_function (GtkWidget *button, gpointer user_data);.
    Il faut donc changer les prototypes des fonctions void mettreFichier(GtkWidget *widget,gpointer data) et void LireFichier(GtkWidget *widget,gpointer data).

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Tu utilises avec gourmandise la déclaration des variables en global. Tu peux très facilement t'en passer. Par exemple dans les fonctions d'écriture/lecture de ton fichier tu utilises la variable "fichier". Il suffit simplement de la déclarer en local dans chacune de ses fonctions pour la faire disparaître en global.

    Pour la fonction mettreFichier (); j'écrirais ce genre de chose :
    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
    void mettreFichier(GtkButton *widget,gpointer data)
    {
    	FILE *fichier;
    
    	Client.nom =gtk_entry_get_text(GTK_ENTRY(pEntry1));
    	Client.prenom =gtk_entry_get_text(GTK_ENTRY(pEntry2));
    	Client.telephone =gtk_entry_get_text(GTK_ENTRY(pEntry3));
    
    	fichier =fopen("monfichier.bin","ab+");
    	if(fichier!=NULL)
        {
    			//			fwrite(&Client,sizeof(personne),1,fichier);
    			fwrite (Client.nom, strlen (Client.nom), 1, fichier);
    			fwrite (Client.prenom, strlen (Client.prenom), 1, fichier);
    			fwrite (Client.telephone, strlen (Client.telephone), 1, fichier);
    			//			gtk_main_quit();
    			fclose(fichier);
        }
    }
    Ici tes données sont correctement inscrites dans le fichier. Cependant pour les lire tu n'as aucun terminateur pour chaque élément (un code les séparant). Un retour chariot entre chacun d'eux peut très bien faire l'affaire par exemple.

    La lettre b ne sert à rien sous linux. De plus je ne comprends pas bien pourquoi tu désires écrire en binaire des données textes ?

  5. #5
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    De plus je ne comprends pas bien pourquoi tu désires écrire en binaire des données textes ?
    Je dirai même plus :
    Writing a struct to a file is highly non-portable -- it's safest to just not try to do it at all. Using a struct like this is guaranteed to work only if
    a) the struct is both written and read as a struct (never a sequence of bytes) and
    b) it's always both written and read on the same (type of) machine.
    Not only are there "endian" issues with different CPUs (which is what it seems you've run into), there are also "alignment" issues.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Tu utilises avec gourmandise la déclaration des variables en global. Tu peux très facilement t'en passer. Par exemple dans les fonctions d'écriture/lecture de ton fichier tu utilises la variable "fichier". Il suffit simplement de la déclarer en local dans chacune de ses fonctions pour la faire disparaître en global.

    Pour la fonction mettreFichier (); j'écrirais ce genre de chose :
    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
    void mettreFichier(GtkButton *widget,gpointer data)
    {
    	FILE *fichier;
    
    	Client.nom =gtk_entry_get_text(GTK_ENTRY(pEntry1));
    	Client.prenom =gtk_entry_get_text(GTK_ENTRY(pEntry2));
    	Client.telephone =gtk_entry_get_text(GTK_ENTRY(pEntry3));
    
    	fichier =fopen("monfichier.bin","ab+");
    	if(fichier!=NULL)
        {
    			//			fwrite(&Client,sizeof(personne),1,fichier);
    			fwrite (Client.nom, strlen (Client.nom), 1, fichier);
    			fwrite (Client.prenom, strlen (Client.prenom), 1, fichier);
    			fwrite (Client.telephone, strlen (Client.telephone), 1, fichier);
    			//			gtk_main_quit();
    			fclose(fichier);
        }
    }
    Ici tes données sont correctement inscrites dans le fichier. Cependant pour les lire tu n'as aucun terminateur pour chaque élément (un code les séparant). Un retour chariot entre chacun d'eux peut très bien faire l'affaire par exemple.

    La lettre b ne sert à rien sous linux. De plus je ne comprends pas bien pourquoi tu désires écrire en binaire des données textes ?
    bonsoir et merci pour ce code..
    mais la fonction Lirefichier n'a t-elle pas de problème?

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Bien sûr qu'elle en a .

    Je te laisse le soin déjà de revoir le code complet pour écrire ton fichier. Une fois fait essayes d'en extraire les informations en fonction du format que tu auras choisi.

    Histoire d'être un peu plus explicite sur le pourquoi la création de ton fichier ne marchait pas est que tu sauvais en réalité la valeur des 3 pointeurs de ta structure personne. Si tu désires garder cette manière de faire tu dois impérativement être déterministe. C'est à dire non pas avoir une structure de pointeurs, mais une structure de tableaux avec des dimensions fixes. Ainsi il est possible de connaître la taille finale de la structure et aussi la taille de chaque élément qui la compose. Ce qui revient bien au final à sauver des données numériques dans ce cas là.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Bien sûr qu'elle en a .

    Je te laisse le soin déjà de revoir le code complet pour écrire ton fichier. Une fois fait essayes d'en extraire les informations en fonction du format que tu auras choisi.

    Histoire d'être un peu plus explicite sur le pourquoi la création de ton fichier ne marchait pas est que tu sauvais en réalité la valeur des 3 pointeurs de ta structure personne. Si tu désires garder cette manière de faire tu dois impérativement être déterministe. C'est à dire non pas avoir une structure de pointeurs, mais une structure de tableaux avec des dimensions fixes. Ainsi il est possible de connaître la taille finale de la structure et aussi la taille de chaque élément qui la compose. Ce qui revient bien au final à sauver des données numériques dans ce cas là.
    maintenant qu est ce que je doit faire au juste parce la je suis un peu perdu

Discussions similaires

  1. Lire et écrire dans un fichier binaire
    Par poche dans le forum C
    Réponses: 17
    Dernier message: 19/03/2007, 16h52
  2. Lire et écrire dans un fichier bin!
    Par poche dans le forum C
    Réponses: 9
    Dernier message: 12/03/2007, 12h42
  3. lire et écrire dans un fichier
    Par karel dans le forum C
    Réponses: 15
    Dernier message: 18/01/2006, 17h24
  4. [FTP] Lire et écrire dans un fichier
    Par dj-julio dans le forum Langage
    Réponses: 49
    Dernier message: 12/01/2006, 11h59
  5. [Rech. Comp.] Lire et écrire dans des fichiers XML
    Par Rodrigue dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/08/2005, 20h48

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