2014-12-31 86 views
0

我想從鏈接列表填充gtk樹存儲,但我得到分段錯誤(核心轉儲)問題在這裏是我的代碼文件結構是一個鏈接列表填充結構教授,旁邊的教授通過名稱matiere密碼僞定義...等從文件填充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; 
+0

爲例你的字符串是否正確地以null結尾你如何填寫清單? –

+0

不是你如何聲明它,你如何寫入數據? File_to_struct * inserer(File_to_struct * Debut,Prof profs) –

+0

File_to_struct * inserer(File_to_struct * Debut,Prof profs)File_to_struct * nv =(File_to_struct *)malloc(sizeof(File_to_struct)); nv-> professeur = profs; nv-> suivant = Debut; Debut = nv; return(Debut); } –

回答

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