从文件中填写Gtk Tree Store

时间:2014-12-31 21:19:11

标签: c file gtk

我正在尝试从链表填充gtk树存储但是我得到了分段错误(核心转储)问题这里是我的代码文件结构是一个链接列表填充结构给教授和下一个教授由名称matiere password伪等定义

store = gtk_list_store_new (NUM_COLUMNNS,G_TYPE_INT,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_INT);

  File_to_struct *p=head;

  /* add data to the list store */
       while(p!=NULL)
       {
          gtk_list_store_append (store, &iter);
          gtk_list_store_set (store, &iter,
                           COLUMNN_ID,p->professeur.ID,
                           COLUMNN_NOM,p->professeur.nom,
                           COLUMNN_MATIERE,p->professeur.matiere,
                           COLUMNN_PSEUD,p->professeur.pseudo,
                           COLUMNN_PASS,p->professeur.password,
                           COLUMNN_VALIDE,p->professeur.valide,
                             -1);
            p=p->suivant;
       }
   FILE fichier=fopen("professeur.txt","r"); 
    Prof professeur; 
    File_to_struct *tete=(File_to_struct)malloc(sizeof(File_to_struct)); 
     tete=NULL; 
     rewind(fichier); 
     while((!feof(fichier))) 
     { 
   fscanf(fichier,"\n%s %s %s %s %d %d\n",professeur.nom,professeur.matiere,professeur.pseudo,professeur.password, &pro‌​fesseur.valide,&professeur.ID);   
  tete=inserer(tete,professeur); } 
 typedef struct prof{ 
    int ID;
    int valide; 
    char nom[40]; 
    char matiere[40]; 
    char password[40]; 
    char pseudo[40]; }Prof; 
    typedef struct file_to_struct{ 
                   Prof professeur; 
                  struct file_to_struct *suivant; }File_to_struct;

1 个答案:

答案 0 :(得分:0)

填写列表时遇到问题,这是如何正确执行此操作的示例

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct Prof
{
    int ID;
    int valide;
    char nom[40];
    char matiere[40];
    char password[40];
    char pseudo[40];
} Prof;

typedef struct File_to_struct
{
    Prof professeur;
    struct File_to_struct *suivant;
} File_to_struct;

File_to_struct *
inserer(File_to_struct *Debut, Prof profs)
{
    File_to_struct *nv;
    File_to_struct *actuel;

    nv = malloc(sizeof(File_to_struct));
    if (nv == NULL)
        return Debut;
    nv->suivant    = NULL;
    nv->professeur = profs;

    actuel = Debut;
    if (Debut == NULL)
        Debut = nv;
    else
    {
        while (actuel->suivant != NULL)
            actuel = actuel->suivant;
        actuel->suivant = nv;
    }
    return Debut;
}

char **
splitString(const char *const text, const char *const delimiter, int *count)
{
    char  *copy;
    char  *pointer;
    char  *token;
    char  *saveptr;
    char **list;

    if ((text == NULL) || (count == NULL) || (delimiter == NULL))
        return NULL;

    copy    = strdup(text);
    *count  = 0;
    pointer = copy;
    list    = NULL;

    while ((token = strtok_r(pointer, delimiter, &saveptr)) != NULL)
    {
        void *auxiliary;

        auxiliary = realloc(list, (1 + *count) * sizeof(char *));
        if (auxiliary == NULL)
        {
            while (*count >= 0)
            {
                free(list[*count]);
                *count -= 1;
            }
            free(copy);
            free(list);
            return NULL;
        }
        list         = auxiliary;
        list[*count] = strdup(token);
        *count      += 1;
        pointer      = NULL;
    }
    free(copy);

    return list;
}

Prof
extractProfesseur(const char *const line)
{
    char **list;
    int    count;
    Prof   prof;

    memset(&prof, 0, sizeof(prof));

    list = splitString(line, " ", &count);
    if (count < 6)
    {
        while (--count >= 0)
            free(list[count]);
        free(list);

        return prof;
    }
    prof.ID     = strtol(list[4], NULL, 10);
    prof.valide = strtol(list[5], NULL, 10);

    strncpy(prof.nom, list[0], 39);
    strncpy(prof.matiere, list[1], 39);
    strncpy(prof.pseudo, list[2], 39);
    strncpy(prof.password, list[3], 39);

    while (--count >= 0)
        free(list[count]);
    free(list);

    return prof;
}

int
main()
{
    FILE           *fichier;
    File_to_struct *tete;
    File_to_struct *actuel;
    char            line[256];

    fichier = fopen("professeur.txt","r");
    if (fichier == NULL)
        return -1; /* n'pouvez pas de ouvrir le fichier */
    tete = NULL;

    rewind(fichier);
    while (fgets(line, sizeof(line), fichier) != NULL)
    {
        Prof professeur;

        professeur = extractProfesseur(line);
        tete       = inserer(tete, professeur);
    }

    actuel = tete;
    while (actuel != NULL)
    {
        Prof            prof;
        File_to_struct *previous;

        prof     = actuel->professeur;
        previous = actuel;
        actuel   = actuel->suivant;

        printf("%s %s %s %s %d %d\n", prof.nom, prof.matiere,
                    prof.pseudo, prof.password, prof.valide, prof.ID);

        free(previous);
    }
    fclose(fichier);

    return 0;
}