我正在尝试从链接列表填充gtk树存储,但是我遇到了分段错误(核心转储)问题,这是我的代码。姓名密码伪...等

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;

最佳答案

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

#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;
}

关于c - 从文件填充Gtk树存储,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27726391/

10-12 07:22