gpt4 book ai didi

c - 将多个结构保存到二进制文件中 (C)

转载 作者:行者123 更新时间:2023-11-30 15:11:04 27 4
gpt4 key购买 nike

我正在写一个函数,该函数应该在二进制文件中保存 3 个结构(其中 2 个是结构数组)。这是我的功能:

void saveFile(Struct1 *s1, Struct2 *s2, Struct3 s3) {
FILE *fp = NULL;
fp = fopen("save.bin", "w+b");

if (fp == NULL) {
printf("Save failed.\n");
}

fwrite(s1, sizeof(Struct1), struct3.nElements, fp);
fwrite(s2, sizeof(Struct2), NELEMENTS, fp);
fwrite(&s3, sizeof(Struct3), 1, fp);

printf("Save done.\n");
}

s1struct3.nElementss2NELEMENTS (这是一个常量)和 s3 只是一个结构体而不是数组。当我尝试使用 HexEditor 打开 save.bin 时,它给出的结果与我预期的结果非常不同,我想知道我是否正确使用了 fwrite 函数,特别是对于结构数组。

最佳答案

您的功能存在一些小问题,可能会导致问题:

  • 您将函数定义为按值获取s3。为什么不传递指向第三个结构体的指针? saveFile 函数是否在调用代码之前正确声明?您确定调用代码按值传递 struct 吗?

  • 您忘记关闭流。句柄丢失,并且内容不会刷新到磁盘,直到程序退出。

  • 您以“w+b”模式打开文件:写入和读取。使用二进制模式是正确的,但读取时不需要添加+。只需使用“wb”

  • 如果fopen失败,您将输出一条诊断消息,但不会从该函数返回。当尝试写入 NULL 流指针时,您将调用未定义的行为。

关于您的问题,文件的转储与您期望的不符...请向我们提供更多信息,例如不同结构的定义和十六进制转储。以下是一些想法:

  • 结构中的某些字段可能需要特定的对齐方式,因此通过填充字节与前一个字段分开。这些填充字节的值不一定是 0:如果结构处于自动存储中或使用 malloc 分配,则它们的初始状态是未定义的,并且可能会因以下操作的副作用而发生变化:存储其他字段。
  • 整数可以有不同的大小,并以小端或大端顺序存储在文件中,具体取决于程序编译的特定体系结构。因此,程序存储的值只能使用在相同架构和操作系统上运行的适当但相当相似的代码来读回。
  • 如果您的结构体包含指针,则您无法真正理解输出文件中存储的值。

关于c - 将多个结构保存到二进制文件中 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35818123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com