2013-01-04 43 views
1

我一直在嘗試在二進制文件和鏈接列表之間進行讀寫操作。有人能解釋我做錯了什麼嗎?將二進制文件讀取到鏈接列表

節省:

currentContact = firstContact; 


while(currentContact != NULL) 
{ 
fwrite (currentContact->firstName, sizeof currentContact->firstName, 1, myFile); 
fwrite (currentContact->surname, sizeof currentContact->surname, 1, myFile); 
fwrite (&currentContact->age, sizeof (int), 1, myFile); 
fwrite (currentContact->telephone, sizeof currentContact->telephone, 1, myFile); 
currentContact = currentContact->next; 
} 

負載:

fread(&numContacts, sizeof(int), 1, myFile);    
    newContact = realloc(newContact, sizeof(struct Contact) * 1); 
    countFile = 1; 
    while (fread(newContact, sizeof(struct Contact), 1, myFile)) 
    { 
    fread(newContact->firstName, sizeof newContact->firstName, 1, myFile); 
    fread(newContact->surname, sizeof newContact->surname, 1, myFile); 
    fread((&newContact->age), sizeof (int), 1, myFile); 
    fread(newContact->telephone, sizeof newContact->telephone, 1, myFile); 

    if (countFile == 1) 
    { 
     firstContact = newContact; 
     newContact = NULL; 
    } 
    else 
    { 
     currentContact = firstContact; 
     count = 0; 
     while(count != countFile) 
     { 
      if(strcmp(newContact->surname, currentContact->surname) < 0) 
      { 
       newContact->next = currentContact->next; 
       currentContact->next = newContact; 
      } 
      currentContact = currentContact->next; 
     } 

    newContact = NULL; 
    } 

    countFile++;    
    } 
    fclose(myFile); 

編輯:

應用一些變化,但仍然通過它去FREAD迴路中的第二解析錯誤後該文件再次...

   newContact = realloc(newContact, sizeof(struct Contact) * numContacts); 
      countFile = 1; 
      while (countFile != numContacts + 1) 
      { 
       fread(newContact, sizeof (struct Contact), 1, myFile); 

       if (countFile == 1) 
       { 
        firstContact = newContact; 
        newContact = NULL; 
       } 
       else 
       { 
        currentContact = firstContact; 
        count = 0; 
        while(count != countFile) 
        { 
         if(strcmp(newContact->surname, currentContact->surname) < 0) 
         { 
          newContact->next = currentContact->next; 
          currentContact->next = newContact; 
         } 
         currentContact = currentContact->next; 
        } 

       newContact = NULL; 
       } 

       countFile++;      
      } 

回答

1

它看起來像一個問題是下面的語句:

while (fread(newContact, sizeof(struct Contact), 1, myFile)) 

上面的語句嘗試讀取到的東西指向的內存由newContact。根據寫入數據的方式,此可能不正確。並且基於循環內的下一個語句讀取各個成員的事實,那麼它是不正確的。所以在while循環內的fread應該可以被消除。

其他一些潛在的問題:

  • 的代碼也許應該爲每個新的聯繫人分配內存(因爲這似乎是第一次分配是僅適用於單個元素)。
  • next指針應該在某個時刻初始化爲NULL(realloc不會將內存清零)。
  • 鏈接新元素似乎有一些問題。例如,如果新元素是新的第一個元素,則應更新頭指針firstContact。此外,如果新元素大於所有現有元素,則不會將其添加到列表中。
  • 代碼應該檢查fread的結果(對於錯誤條件)。

OP編輯後整個列表的分配是一個合理的想法。但是,有必要在循環的每次迭代中更新newContact以指向正確的內存塊。您可以保留一個單獨的指針變量來維護該信息。另外,讀取整個聯繫人的改變也需要在寫作代碼中體現出來。因爲寫入和讀取的數據量不太可能相同(例如,該結構具有佔用空間的下一個成員變量,並且不會寫入寫入的數據中。)

+0

我已經改變它,以便它爲充分接觸分配存儲器,而該單個元件:的fread(newContact,的sizeof(結構聯繫),1,MYFILE); 無論如何這個文件是按順序保存的,所以每個新條目都應該是列表中的最後一個條目,所以最後一個問題應該不成問題。 – user1949687

+0

最後一個問題仍然是一個問題 - 在調試器中逐步完成。新項目不會被添加到列表中。 –

+0

感謝您的幫助,我已經設法解決了。在您的幫助和調試器中,我設法解決了多個愚蠢的錯誤。 – user1949687

0

我認爲您的問題已在

fwrite (currentContact->firstName 

你需要做的是寫整個結構不寫每個成員

fwrite (currentContact, sizeof(type of currentContact),.. //或任何UR結構被調用。