2012-03-13 168 views
0

試圖編寫一個函數,將我的結構數組寫入二進制文件。
我以爲我能夠一次將它作爲一個完整的單位拷貝過來,但它不適合我。二進制文件和寫入結構

我是否需要編寫每個單獨的子實體或者是否有辦法在一個大團隊中完成它?

{ 

     void export_binary(char *data_base_name, student_record *ptr,int array_flag,unsigned int rec_cnt) 
    { 
     if (array_flag==-99) 
      { 
       printf("\n\nDatabase not loaded...\n\nPlease IMPORT or CREATE a new database.\n\n"); 
       system("pause"); 
       return; 
      } 

    int rec_counter; 
    FILE *pf; 

     pf=fopen(data_base_name,"wb"); 

     if (!pf) 
      { 
       printf("*** FILE OPENING ERROR ***\n\n"); 
       system("pause"); 
       return ; 
      } 
     for (rec_counter=0; rec_counter <= rec_cnt; rec_counter++) 
      { 
       fwrite(&ptr[rec_counter], sizeof(student_record), 1, pf); 
      } 


       if ((fclose(pf))!=0) 
      { 
       printf("\n\n*** FILE Error - Closing file FAILED! ***\n\n"); 
       system("pause"); 
       return; 
      } 
       printf("\n\n*** Database SAVED ***"); 
       system("pause"); 
       return; 
} 
+0

附加信息:我得到了我的記錄元素是一個文件,但垃圾的一切。我將結構指針從main傳遞給函數... student_record * ptr – 2012-03-13 09:09:31

回答

2

你實際上並不說明什麼錯誤(這是當你試圖尋求幫助非常重要),但前提是你沒有像指針東西在你的結構,你可以通過更換做到在一次全部:

for (rec_counter=0; rec_counter <= rec_cnt; rec_counter++) 
{ 
    fwrite(&ptr[rec_counter], sizeof(student_record), 1, pf); 
} 

有:

int actual = fwrite (ptr, sizeof(student_record), rec_cnt, pf); 
if (actual != rec_cnt) ... a problem occurred. 

(你應該總是檢查返回值)。

所以不,你不必分別寫數組中每個結構的每個元素,你可以用另一種方式寫一個命中的整個數組。


至於你的其他信息:

我得到了我的記錄元素是一個文件,但垃圾的一切。

是的,你會的,如果你寫出比你填充的記錄更多的記錄。換句話說,如果rec_cnt是數組的大小而不是您已經填充的數組元素的數量,那麼最後會有垃圾。

我假設(也許是錯誤的)rec_cnt是填充元素的數量。你應該有一個在某個地方具有該值的變量(如果rec_cnt不是這樣),否則你不知道哪些元素是好的,哪些是垃圾。

使用變量來決定要使用fwrite寫入多少個元素。


如果它不是後來數組元素是垃圾,而是未使用的空間內每個元件,這是預期的和不相關的。爲了對齊的目的,結構允許在它們內部(和結尾處)具有填充。

如果在寫入和讀取時填充相同,則可以放心地忽略它。

如果對齊可能是不同的,是的,你可能必須要麼:對於結構

  • 關閉填充(實現定義的支持,如#pragma pack);或
  • 分別寫出結構的字段以刪除填充。
+0

謝謝...現在它正在工作 – 2012-03-13 21:22:30