2014-01-24 46 views
0

所以,我的問題很簡單,我必須從txt文件中讀取一組數據(2個字符串和幾個整數)。每個數據都由\ n字符分隔。問題是,而不是實際讀取的數據,我得到段錯誤,這是我對於這部分代碼:C無法在txt模式下從FILE初始化列表

if(head == NULL){ //if the list is empty I want to read data from the file 
    fp=fopen("elementi.txt", "r"); 
    if(fp==NULL) {printf("File non esistente"); exit(2);} //this is just a dumb error line 
    else { 
     while(fgets(buffer.info.nome,20,fp)!=NULL){ 
      nl_eat(buffer.info.nome); //this function eliminate the '\n' from the string just read 
     fgets(buffer.info.artista,20,fp); 
      nl_eat(buffer.info.artista); 
      fscanf(fp, "%d%*c", buffer.info.data_uscita.anno); 
      fscanf(fp, "%d%*c", buffer.info.data_uscita.mese); 
      fscanf(fp, "%d%*c", buffer.info.data_uscita.giorno); 
      fscanf(fp, "%f%*c", buffer.info.prezzo); 
      addFine(&head,buffer); //adds the read element at the end of the list  
     } 
     fclose(fp); 
    } 
} 

所以我想給更多的信息,緩衝區就是nodo是

typedef struct Data { 
int anno; 
int mese; 
int giorno; 
} data; 

typedef struct cd { 
char nome[25]; 
char artista [20]; 
data data_uscita; 
float prezzo; 
} CD; 

struct Nodo{ 
CD info; 
struct Nodo *next; 
}; 

typedef struct Nodo nodo; 
鍵入nodo

我試圖寫一個小例子,這裏是全碼:www.pastebin.com/hLTj8ZG4

+1

歡迎來到Stack Overflow。請儘快閱讀[關於]頁面。你的循環測試'fgets()'的效果是好的;如果你檢查了每個'fscanf()'調用和額外的'fgets()'都可以工作,那麼它會更好。如果'buffer.info.data_uscita.anno'是一個整數指針而不是一個整數,那麼你有一個不尋常的數據結構。與其他數字輸入類似。你的編譯器沒有警告你?如果沒有,找到編譯器警告(如果使用'gcc',最低限度'gcc -Wall')。另外,最後一個'fscanf()'離開換行符,被主循環中的'fgets()'讀取。 –

+0

@ user3232752你有沒有嘗試像[valgrind](http://valgrind.org/)這樣的分析工具? –

+0

@ wesley.mesquita:堅果,見大錘;大錘,這是堅果。沒有動態內存分配的證據,這限制了'valgrind'可以幫助的數量。別誤會我的意思; 'valgrind'是一個很棒的工具。不過,我不確定這對代碼有幫助。 –

回答

1

核心轉儲可能是因爲你逝去的整數,而不是指向整數到fscanf()功能。更多或更少的最小變化是:

nodo buffer; 

if (head == NULL) 
{ 
    char const *file = "elementi.txt"; 
    fp = fopen(file, "r"); 
    if (fp == NULL) 
    { 
     fprintf(stderr, "File %s non esistente", file); 
     exit(2); 
    } 
    else 
    { 
     while (fgets(buffer.info.nome, sizeof(buffer.info.nome), fp) != NULL) 
     { 
      nl_eat(buffer.info.nome); 
      if (fgets(buffer.info.artista, sizeof(buffer.info.artista), fp) == NULL) 
       break; 
      nl_eat(buffer.info.artista); 
      if (fscanf(fp, "%d%*c", &buffer.info.data_uscita.anno) != 1 || 
       fscanf(fp, "%d%*c", &buffer.info.data_uscita.mese) != 1 || 
       fscanf(fp, "%d%*c", &buffer.info.data_uscita.giorno) != 1 || 
       fscanf(fp, "%f%*c", &buffer.info.prezzo) != 1) 
       break; 
      addFine(&head, buffer); 
     } 
     fclose(fp); 
    } 
} 

你應該傳遞到buffer作爲addFine指針?

讀取後您有'賦值抑制'字符。如果行中沒有尾隨空白,那些將讀取換行符。但是,您的程序無法檢測它們是否成功。您可能會更好地分配角色,以便測試您是否擁有角​​色,如果是,是否是換行符。如有必要,您可以將角色吞併到行尾。

如果您仍然收到核心轉儲,那麼我們需要更多上下文。問題可能在addFine()。一種幫助調試的方法是在讀取數據時打印出數據。這將檢查程序是否正在查看您希望看到的數據。