2014-01-22 114 views
1

好吧,所以這裏是我的問題我想弄清楚如何編寫我的單鏈表到文件,不知道應該怎麼用,所以我去了txt文件和fprintf不知道如果如果有人能夠說出哪種方式會更好,解釋會更好,那該多好。那麼回到我的代碼我有問題保存到文件基本上我的函數爲第一個客戶端保存項目,但不保存第二個項目。我做錯了什麼?如果我的代碼的其餘部分是必要的我可以發佈它,但它像500行。保存到txt文件鏈接列表

struct item 
{ 
    char item_name[30]; 
    char item_state[30]; 
    double item_price; 
    char item_status[30]; 
    double item_price_if_not; 
    struct item *next; 
}; 
struct client 
{ 
    char client_name[30]; 
    char client_last_name[30]; 
    struct item *item_data; 
    struct client *next; 
}; 




void savetxt(struct client *head) 
{ 
    FILE *f; 
f = fopen("data.txt","w"); 
    if(f == NULL) 
    { 
     printf("error"); 
    } 
    struct item *CurrentItem = head->item_data; 
    while(head != NULL) 
    { 
     printf("try"); 
     fprintf(f,"%s\n",head->client_name); 
     fprintf(f,"%s\n",head->client_last_name); 
     while(CurrentItem != NULL) 
     { 
      printf("tryitem"); 
      fprintf(f,"%s\n",CurrentItem->item_name); 
      fprintf(f,"%s\n",CurrentItem->item_state); 
      fprintf(f,"%fp\n",CurrentItem->item_price); 
      fprintf(f,"%s\n",CurrentItem->item_status); 
      fprintf(f,"%fp\n",CurrentItem->item_price_if_not); 
      CurrentItem = CurrentItem->next; 
     } 
     head = head->next; 
     fprintf(f,"\n\n"); 
    } 
    fclose(f); 
    return NULL; 
} 
+0

錯誤?問題? –

+0

那麼沒有錯誤,就像我說它保存客戶端列表,但第二個客戶端的內部列表沒有保存 – user3209183

回答

1

您需要在外部while循環的最後更新CurrentItem,你設置新head後:

... 
head = head->next; 
CurrentItem = head->item_data; 
... 

否則,CURRENTITEM用來掃描物品的清單第一個客戶端,然後永遠不會重置到下一個客戶端的項目的開始。

編輯

它實際上是更好的while循環的開始設置CurrentItem,否則當head爲NULL CurrentItem = head->item_data會失敗:

while (head != NULL) { 
    CurrentItem = head->item_data; 
    ... 
} 
+0

當我添加這個部分時,我的函數在第一次循環後崩潰。你確定當我開始設置struct item * CurrentItem = head-> item_data;可以像這樣更新它? – user3209183

+0

當然。檢查head-> item_data是否在列表末尾正確設置爲NULL,然後使用'gdb'。另外,發佈一個包含一些數據的完整示例以重現問題。 – lbolla

+0

啊,顯然如果'head'爲NULL'CurrentItem'將嘗試訪問一個NULL指針。所以你最好在while循環的開始處移動CurrentItem。 – lbolla