如何将包含动态分配数组的结构写入二进制文件?

时间:2018-03-20 18:29:14

标签: c

#include <stdio.h>
#include <stdlib.h>

struct SomeStruct{
    int id;
    int* dynamicArray;
};

int main(){
    struct SomeStruct test;
    test.id = 5;
    // allocate array
    test.dynamicArray = malloc(sizeof(int)*100);
    // save struct to a file
    FILE* handle = fopen("data", "wb");
    fwrite(&test, sizeof(test), 1, handle);
    fclose(handle);
    return 0;
}

运行此代码后,data文件的大小为16个字节。显然,整数指针已写入文件而不是整个dynamicArray元素。如何在文件中正确编写此类结构?

1 个答案:

答案 0 :(得分:3)

  1. 写下id。
  2. 然后写下数组。
  3. fwrite(&test.id, sizeof(test.id), 1, handle);
    fwrite(test.dynamicArray , sizeof(test.dynamicArray[0]), 100, handle);
    

    我想指出使用硬编码的数字100是有问题的。

    1. 您必须确保read函数也假设。
    2. 如果您决定更改分配的元素数量,则必须记住返回两个位置(写入和读取)以更新它们。
    3. 最好将大小存储在struct本身。

      struct SomeStruct{
          int id;
          size_t size;
          int* dynamicArray;
      };
      

      test.id = 5;
      test.size = 100;
      // allocate array
      test.dynamicArray = malloc(sizeof(int)*test.size);
      

      然后您可以将写入逻辑更新为:

      fwrite(&test.id, sizeof(test.id), 1, handle);
      fwrite(&test.size, sizeof(test.size), 1, handle);
      fwrite(test.dynamicArray , sizeof(test.dynamicArray[0]), test.size, handle);
      

      当您重读数据时,您将获得可用的大小信息,您可以为dynamicArray成员分配正确的内存。