Forum Programmation.c Sauver un Gtkliststore

Posté par  .
Étiquettes : aucune
0
6
mar.
2006
Bonjour,

Je suis débutant en programmation c (c et non c++), cependant, en utilisant glade
et anjuta, j'ai réussi à faire fonctionner une petite application utilisant gnome et gtk (2.8).

Ma question est simple :

Y a-t-il un moyen de sauver un gtkliststore (je suppose que c'est là ou les données sont stockées ?) sans le parcourir ? (Car ça serait très utile.)

J'ai essayé notamment ça :


void sauver_liste_courtier(const gchar *filename)
{
FILE *fp;
fp = fopen(filename,"w");
fwrite(courtiers_list, sizeof(courtiers_list), 1, fp);
fclose(fp);
}

void charger_liste_courtier (const gchar *filename)
{
FILE *fp;
fp = fopen(filename,"r");
fread(courtiers_list, sizeof(courtiers_list), 1, fp);
fclose(fp);
}



courtiers_list est un *gtkliststore en variable globale.

Rem : même si j'ajoute des "rows" (qui s'affiche correctement dans l'application), le fichier crée ne change pas de taille (style 16 octet) donc, ça ne marche vraiment pas !

S'il faut le parcourir, pouvez-m'aider à créer un fonction ? Ou y'aurait-il une librairie qui puisse le faire à ma place.. ou une astuce ?...

Merci d'avance.
  • # Re

    Posté par  (site web personnel) . Évalué à 2.

    Ouaip c'est normal tout ca.

    Je ne sais pas exactement ce qu'est une gtkliststore mais apriori c'est une structure contenant au minimum un pointer vers une donnée et un pointeur vers la structure suivante, comme les conteneurs listes chaines en c++.

    La grosse différence est qu'en C c'est a toi de faire la fonction (ou d'utiliser) qui parcours la liste et qui récupere les données de chaque champs.

    En résumé:

    *Sauvegarde*

    POINTEUR=courtier_liste;
    do {
    Sauver(POINTEUR->data);
    }
    while( POINTEUR=POINTEUR->next );

    *Restauration*
    courtier_liste = malloc(sizeof(courtier_liste));
    P1=courtier_liste;
    P2=courtier_liste;
    while(data = Charger(fichier)) {
    P1->data = data;
    if (P1!=P2) P2->next = P1;
    P2 = P1;
    P1 = malloc(sizeof(courtier_liste));
    }
  • # Début de réponse ....

    Posté par  . Évalué à 1.

    En faisant comme ça, tu ne fais que sauver un pointeur (l'adresse ou est stocké le gtkliststore) mais pas le contenu. Voici un exemple, chaque ligne contient 2 colonnes (nom, prénom), à toi de l'adapter à tes besoins :
    #define  COLONNE_NOM (0)
    #define COLONNE_PRENOM (1)
    
    gboolean sauver_element(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
    {
      FILE *fp = (FILE *)data;
      gchar *nom, *prenom;
    
      gtk_tree_model_get(model, iter, COLONNE_NOM, &nom, COLONNE_PRENOM, &prenom, -1);
    
      fprintf(fp, "%s\t%s\n", nom, prenom);
    
      g_free(nom);
      g_free(prenom);
    
      return(FALSE);
    } 
    
    void sauver_liste(GtkTreeModel *list_store, const gchar *filename)
    {
      FILE *fp;
    
      fp = fopen(filename, "w");
    
      if (!fp) return;
    
      gtk_tree_model_foreach(list_store, 
    			 (GtkTreeModelForeachFunc) sauver_element,
    			 fp);
    
      fclose(fp);
    }
    
    void charger_liste(GtkListStore *list, const gchar *filename)
    {
      FILE *fp;
      GtkTreeIter iter;
      gchar nom[256], prenom[256];
    
      fp = fopen(filename, "r");
    
      if (!fp) return;
    
      while(!feof(fp)) {
        fscanf(fp, "%s\t%s\n", nom, prenom);
    
        gtk_list_store_append(list, &iter);
        gtk_list_store_set(list, &iter, 
    		       COLONNE_NOM, nom,
    		       COLONNE_PRENOM, prenom,
    		       -1);
    
      }
    
      fclose(fp);
    }
    
    
    A cette adresse, tu trouveras un tutoriel (en anglais) sur l'utilisation des GtkTreeView, etc .... http://scentric.net/tutorial/treeview-tutorial.html

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.