【问题标题】:read a binary in (c) file containing different structs, which have pointer as member在 (c) 文件中读取包含不同结构的二进制文件,这些结构具有指针作为成员
【发布时间】:2020-04-16 04:56:52
【问题描述】:

如果没有得到很好的解释,我很抱歉。我到处寻找,但找不到解决方案。我正在尝试读取 c 中的二进制文件,但问题是它包含许多具有依赖关系的结构。我知道如何将一种结构类型读入变量,但在这种情况下不知道。这是我所说的结构之间的依赖关系的示例:

typedef struct
{
    int a;
    int b;
} Car;
typedef struct
{
    char c[10];
    int d;
    Car* cars;
} Seller;
typedef struct
{
    int e;
    Seller* sellers;
} Maker;

阅读时,我必须能够将每辆车与其卖家联系起来,并将每个卖家与其制造商联系起来。

【问题讨论】:

  • 在磁盘上存储数据时,您不能(有用地)存储地址,因为不能保证在读取数据时将数据读回相同的内存位置,即使它是同一个程序写入然后读取数据。因此,您必须为磁盘存储“序列化”数据。这是一个搜索词,但它会导致大量关于 Java 等的信息。搜索类似“c language serialize structures”的内容。基本上,您需要在文件中创建定义大小的数组,并将索引记录到磁盘结构中的这些数组中。
  • 文件结构是什么,可以分享一下格式吗?尝试使用有助于更好地理解您想要的方式的代码进行布局。
  • 可以(有用地)存储地址,因为如果使用mmap() 创建特定地址空间映射,则可以保证在读取数据时将数据读回相同的内存位置。跨度>
  • 如果你打算使用mmap()、@Armali,那么你必须使用只将数据放在映射内存中的内存分配——这意味着不使用malloc()等。

标签: c pointers struct binaryfiles


【解决方案1】:

您将单独阅读每个nested structures

例子:

   Marker marker;
   fread(&marker.e, sizeof (int), 1, filePtr);

   marker.sellers = malloc(sizeof (*marker.sellers));
   fread(&marker.sellers->c , sizeof (marker.sellers->c), 1,filePtr);
   fread(&marker.sellers->d , sizeof (marker.sellers->d), 1,filePtr);

   marker.sellers->cars = malloc(sizeof (*marker.sellers->cars));
   fread(marker.sellers->cars, sizeof (*marker.sellers->cars), 1, filePtr);

【讨论】:

  • 我尝试了您的解决方案,它有点工作,但我无法访问存储在汽车成员中的数据。我无法访问cars.a 或cars.b
猜你喜欢
  • 2019-10-02
  • 2017-01-26
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
相关资源
最近更新 更多