2015-05-28 37 views
0

這是我用來加載它的功能,有時它的工作原理,但是當我離開的計劃和重新編譯,它只會崩潰:加載文件到基於C鏈表,有時工作,有時犯規

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

//this is how I declared the list 
struct plantillas { 
    int iduser; 
    int idplant; 
    char name[31]; 
    int pres; 
    int punt; 
    struct plantillas *next; 
}; 
struct plantillas *first, *last; 

//This is the main that calls loadfile: 
int main(){ 
    FILE *file; 
    file = fopen("Plantillas.txt", "r"); 
    puts("a"); 
    load_file(file); 
    fclose(file); 
} 

//this is the funcion that actually loads the file 
void load_file(FILE *file) { 
    char cadaux[100]; 
    first = (struct plantillas *) NULL; 
    last = (struct plantillas *) NULL; 
    struct plantillas *new; 

    while (!feof(fichero)){ 
     /* save memory for the new element on the list */ 
     new = (struct plantillas *) malloc(sizeof(struct plantillas)); 
     if (new == NULL) printf("No memory avaiable!\n"); 
     fflush(stdout); 

     readline(file, cadaux); //I'll explain about this later 
     sscanf(cadaux, "%d %d %s %d %d", &new->iduser, &new->idplant, new->name, &new->pres, &new->punt); 

     new->next = NULL; 

     /* this will find out if the linked list is empty or not */ 
     if (first == NULL) { 
      first = new; 
      last = new; 
     } 
     else { 
      /* if it isn't, the one that was last before now has to point to the next element on the list */ 
      last->next = new; 
      /* now we make the new be the last */ 
      last = new; 
     } 
    } 
} 

/*The readline function is because of format issues. As it is an assignment for school, the format of the file has to be in1-int2- string1-int3-int4, readline reads each line on the file and turn the '-' into ' ' and then saves it into an auxiliary string. Here is the function:*/ 

void readline(FILE * a, char * b) 
{ 
    int i; 
    fscanf(a, "%s", b); 
    for (i = 0; b[i] != '\n'; i++) 
    { 
     if (b[i] == '-') b[i] = ' '; 
    } 
} 

對不起,如果有一些變量可以匹配,我將西班牙語的代碼翻譯成試圖讓它更容易理解。另外,對於格式化問題感到抱歉,我的第一篇文章和我遇到了一些問題

+0

這個大小的東西,後期所有的代碼放在一起.. – amdixon

+0

另外,我建議你使用['fgets'(http://en.cppreference.com/w/c/io/fgets)來讀取輸入而不是'fscanf'。 –

+0

¿我應該使用什麼樣的循環?我之前做過,但它也比我想要的要多,我使用readline和sscanf修復了(嚴重)if(!feof)。另外,我不能使用fgets,因爲文件中的字段被' - '分隔,而不是空格。 @JoachimPileborg – DrLyra

回答

1

有兩個主要您的代碼中的錯誤,將導致問題。

首先是你不應該這樣做while (!feof(...)),因爲EOF標誌沒有設置,直到你試圖從文件之外讀取,導致循環迭代一次到很多。這是不好的,但不是致命的,因爲它所做的只是導致您添加一個額外的節點,最後添加了虛擬數據。

第二個也是絕對致命的錯誤是,您使用fscanf來讀取不包含換行符(或任何空白)的字符串,然後在寫入緩衝區時查找換行符。因爲你讀的字符串將不包含換行符,fscanf後循環將超越緩衝區的末尾,你將最有可能寫入數據的地方堆棧導致未定義行爲上。該循環的正確條件是查找字符串終止符'\0'


我的建議,以解決這兩個問題是不是有一個readline功能,並使用fgets代替,並用while (fgets(cadaux, sizeof(cadaux), file) != NULL)作爲循環條件,並更換'-'字符空格的功能,並且在功能檢查均爲換行符和循環中的字符串終止符。

+1

可能要鏈接到這個問題:http://stackoverflow.com/questions/5431941/why- is-while-feof-file-always-wrong – szczurcio

+0

非常感謝大家,現在工作正常:) – DrLyra

相關問題