2012-03-13 129 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