2012-11-20 56 views
3

當我將文件中的信息讀入電話簿程序並嘗試通過聯繫人列表查看時,第一次嘗試查看該列表時空白,但如果您選擇再次查看,文件中的內容就在那裏。即使更加狡猾,當您通過程序添加名稱時,名稱會與文件數據一起顯示一次,但如果您再次檢查該名稱,則新名稱將消失。如果您刪除名稱,則會將其刪除一次,但如果再次查看聯繫人列表,名稱會再次出現。我很茫然。這是我的閱讀功能和我的打印功能。閱讀文件時出現奇怪的結果

void file2(fr*friends ,int* counter, int i,char buffer[],FILE*read,char user_entry3[]) 
{ 
    int len; 
    fr temp; 
    *counter=0; 
    i=0; 
    fseek(read, 0, SEEK_SET); 
    while (fgets(buffer, 80, read) != NULL) { 
     temp.First_Name=malloc(36); //was j+1 
     temp.Last_Name=malloc(36); //strlen(buffer)); 

     sscanf(buffer,"%s %s",temp.First_Name,temp.Last_Name); 

     fgets(buffer, 20, read); 
     len=strlen(buffer); 
     if(buffer[len-1]=='\n') 
      buffer[len-1]='\0'; 

     temp.home=malloc(20); //len); 
     strcpy(temp.home, buffer); 

     fgets(buffer, 20, read); 
     len=strlen(buffer); 
     if(buffer[len-1]=='\n') 
      buffer[len-1]='\0'; 


     temp.cell=malloc(20); //len); 
     strcpy(temp.cell, buffer); 

     friends[i].First_Name=malloc(MAXNAME); 
     friends[i].Last_Name=malloc(MAXNAME); 
     friends[i].home=malloc(MAXPHONE); 
     friends[i].cell=malloc(MAXPHONE); 

     if(!friends[i].First_Name || !friends[i].Last_Name || !friends[i].home || !friends[i].cell) { 
      printf("\nmalloc() failed!\n"); 
      getchar(); 
      return; 
     } 

     strcpy(friends[*counter].First_Name,temp.First_Name); 
     strcpy(friends[*counter].Last_Name,temp.Last_Name); 
     strcpy(friends[*counter].home,temp.home); 
     strcpy(friends[*counter].cell,temp.cell); 


     (*counter)++; 
     i++; 

    } 
    //fclose(read); 
    free(temp.Last_Name); 
    free(temp.First_Name); 
    free(temp.home); 
    free(temp.cell); 
} 


void print_contact(fr*friends ,int* counter, int i,char buffer[],char user_entry3[50],FILE*read) { 

    for(i = 0; i < *counter; i++) 

     if (strlen(friends[i].First_Name) && strlen(friends[i].Last_Name)&&  strlen(friends[i].home)&& strlen(friends[i].cell)) 
     { 

      getFirst(friends, i); 
      getLast(friends, i); 
      getHome(friends, i); 
      getCell(friends, i); 



     } 
    file2(friends ,counter,i,buffer,read,user_entry3); 

} 

這很奇怪,因爲它就像程序完美工作一次,但不是再次。

+3

這是不夠的你的代碼 - 哪裏的main()?此外,您的打印程序正在調用您的加載例程,它已打印您的清單 - 這是不對的。 –

回答

0

這很奇怪,因爲它就像程序一次完美工作,但不是再次。

恐怕真的只是因爲它的工作:

  • friends某處預分配?因爲你只是繼續閱讀來自文件的輸入並遞增i直到文件結尾(或錯誤) - 這可能遲早會溢出;

  • 您讀取了80個字符,然後嘗試將其置於36個字符的2次 - 即可輕鬆再次溢出。不要提到將這些80讀入通過幾個函數作爲參數傳遞的緩衝區 - 爲什麼不使用局部變量?魔術數字36更小,大於或等於MAXNAME?爲什麼?

  • malloc()temp在循環的每次迭代中,但它只在其完成後一次 - 泄漏內存〜120B /條目;