gpt4 book ai didi

c - 将结构体的 fwrite() 和 fread() 部分写入二进制文件

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

我的二进制文件被分成 block 。现在我想将一个结构写入我的二进制文件。如果我的结构的大小大于 block 的大小,我正在考虑将结构拆分为多个部分,然后将每个部分写入一个 block (这些 block 不需要是连续的)。

For example, I divide my binary file into blocks of size 4 bytes. The size of my struct is 9 bytes. Then I split my struct into 3 parts (4 bytes, 4 bytes, and 1 byte). And I'm going to write part 1 (4 bytes) to 1st block, part 2 (4 bytes) to 3rd block, and part 3 (1 byte) to 6th block.

因此,如果我使用 fwrite(str , 4 , 1 , file),我可以将第 1 部分写入第 1 个 block 。但其他部分呢?

此外,如果我想从二进制文件中读取结构,因为我的结构被分为上面的 3 部分。如何使用 fread() 读取每个部分并将它们组合成一个完整的结构?

这个想法可行吗?

最佳答案

unsigned char 保证没有填充位,并且它的大小定义为 1,因此任何其他类型的数据对象都可以复制为 sizeof(the object or the type ) 无符号字符。不过,您不能将两个对象作为两个无符号字符数组进行比较,因为较大的类型可能具有填充(不关心)位,这些位在两个对象中可能不同。

写作:

unsigned char *ptr;

ptr = (unsigned char *) &myStruct;
fwrite(ptr, 1, 4, myStream);
ptr += 4;
fwrite(ptr, 1, 4, myStream);
ptr += 4;
fwrite(ptr, 1, 1, myStream);

阅读:

unsigned char *ptr;

ptr = (unsigned char *) &myStruct;
fread(ptr, 1, 4, myStream);
ptr += 4;
fread(ptr, 1, 4, myStream);
ptr += 4;
fread(ptr, 1, 1, myStream);

读/写 4 个大小为 1 的元素,而不是 1 个大小为 4 的对象,这可能是个好主意。我认为,后者可能会破坏对齐限制。

如果需要,可以跳过 ptr 变量并即时转换:

fwrite(&myStruct, 1, 4, myStream);
fwrite((unsigned char *) &myStruct + 4, 1, 4, myStream);
fwrite((unsigned char *) &myStruct + 8, 1, 1, myStream);

关于c - 将结构体的 fwrite() 和 fread() 部分写入二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27221786/

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