2013-10-06 18 views
0

我有一個代碼,將位於另一個雙向鏈表中的雙向鏈表中的學生編號(stdnum)保存到文件中。我注意到有時會打印「(null)」和多餘的空格。我如何避免這些?這裏是我的代碼:保存到c中的文件

typedef struct frn{ //structure for friend 
char stdnum[20]; 
struct frn *next; 
struct frn *prev; 
}friend; 

typedef struct std{ //structure for student 
char stdnum[20]; 
char name[20]; 
char course[10]; 
struct frn *friendh; 
struct frn *friendt; 
struct std *next; 
struct std *prev; 
}student; 



FILE *fp1; 
student *y = h->next; 
friend *y1; 
fp1 = fopen("friends.txt", "w"); 
    if(y != t){ 
     while(y != t){ 
      y1 = y->friendh; 
      while(y1 != NULL){ 
       fprintf(fp1, "%s\n", y1->prev->stdnum); 
       y1 = y1->next; 
      } 
      y = y->next; 
     } 
    } 
fclose(fp1); 
+0

取決於你有這些鏈表中得到了什麼。 – sukhvir

+0

鏈表是好的,我有其他看到列表的功能,它只有有效的字符在裏面。哦,還有,每個列表都有一個虛擬節點。 :) –

+0

對於鏈表的某些部分,「stdnum」可能是空的嗎? – sukhvir

回答

0

閱讀您的意見後,這是爲什麼其打印NULL:當你的第一個節點上

fprintf(fp1, "%s\n", y1->prev->stdnum) 

會發生什麼你的鏈表(y1)(你第一次進入內部時)?當你做y1-> prev-> stdnum你正在訪問隨機存儲器或者如果你已經將鏈表初始化爲NULL值爲空值。這就是打印的內容。

然後直接打印後,null你做y1 = y1->next。將您帶到鏈接列表的第二個節點。

如今再次當你這樣做:

fprintf(fp1, "%s\n", y1->prev->stdnum) 

現在正在打印的第一個節點的「stdnum的價值,你在評論中提到的是空的。所以fprintf打印出一個空的空間。

你能證實nullblank space彼此緊挨着嗎?

你能解決這個問題是這樣的:

typedef struct frn{ //structure for friend 
    char stdnum[20]; 
    struct frn *next = NULL; 
    struct frn *prev = NULL; 
}friend; 

fp1 = fopen("friends.txt", "w"); // I would highly recommend, you put an error check here to verify if the file opened or not 
if(y != t){ 
    while(y != t){ 
     y1 = y->friendh; 
     while(y1 != NULL){ 
      if(y1->prev==NULL){ 
       y1 = y1->next; 
      }else{ 
      fprintf(fp1, "%s\n", y1->prev->stdnum); 
      y1 = y1->next; 
      } 
     } 
     y = y->next; 
    } 
} 
fclose(fp1); 
0

幾件事情需要注意:

  • 你不應該使用的名稱爲「朋友」,因爲它是在C++

  • 檢查關鍵字,如果你可以打開文件

  • 第一個if(if(y!= t))是不必要的(已經被while循環掩蓋了)

  • 什麼是「t」?這是一個特殊的學生號碼嗎?

  • 您正在打印字符串(%s),而不是數字(%d)。你是否將學生號碼保存爲字符串?

  • 請向我們展示學生的結構。這是很難回答你的問題不知道你如何建立你的清單

+0

*我會嘗試使用friends.txt而不是 *是的,我檢查並可以打開文件。 *哦。我會刪除它,因爲它沒有必要。 * t是第一個雙向鏈表的尾部 *即時打印字符串:) * ive爲學生添加了我的結構。希望它可以幫助。 –