二进制文件并将结构写入它们

时间:2012-03-13 08:59:45

标签: c data-structures binaryfiles

尝试编写一个将我的结构数组写入二进制文件的函数 我以为我能够一次将它复制成一个完整的单元阵列,但它对我不起作用。

我是否需要编写每个子实体或者是否有办法在大块中执行此操作?

    {

       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;
}

1 个答案:

答案 0 :(得分: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);或
  • 分别写出结构的字段以删除填充。