我的二进制文件被分成块。现在我想写一个结构到我的二进制文件。 如果我的结构的大小大于块的大小,我想将结构拆分成部分,然后将每个部分写入一个块(这些块不需要是连续的)。
例如,我将二进制文件划分为大小为4字节的块。我的struct的大小是9个字节。 然后我将我的结构分成3个部分(4个字节,4个字节和1个字节)。我要将第1部分(4字节)写入第1块,第2部分(4字节)写入第3块,第3部分(1字节)写入第6块。
因此,如果我使用 fwrite(str,4,1,file),我可以将第1部分写入第1块。但其他部分怎么样?
另外,如果我想从我的二进制文件中读取我的结构,因为我的结构被分成如上所述的3个部分。如何阅读每个部分并使用fread()将它们组合成一个完整的结构?
这个想法有可能吗?
答案 0 :(得分:1)
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);