在C语言中,你必须手动序列化结构体(将它们转换为一系列字节)。如果你希望输出的数据可以被另一台机器读取,你需要考虑大小端
endianness。以下是一个简单的例子,展示如何对结构体进行序列化(写入文件),但不考虑大小端/不同字长,因此代码不可移植。
size_t length;
length = strlen(s->name) + 1;
fwrite(&length, sizeof(length), 1, fp);
fwrite(s->name, 1, length, fp);
length = strlen(s->surname) + 1;
fwrite(&length, sizeof(length), 1, fp);
fwrite(s->surname, 1, length, fp);
fwrite(&s->age, sizeof(s->age), 1, fp);
并且要反序列化:
size_t length;
fread(&length, sizeof(length), 1, fp);
s->name = malloc(length);
fread(s->name, 1, length, fp);
fread(&length, sizeof(length), 1, fp);
s->surname = malloc(length);
fread(s->surname, 1, length, fp);
fread(&s->age, sizeof(s->age), 1, fp);
在实际应用中,您应该检查输入的有效性,而不是盲目地假设输入是有效和可信的。此外,您需要决定要使用哪种字节顺序来存储您的
int
、
size_t
等,并通过使用位移确保您以正确的字节顺序读取/写入它们。
顺便说一下,您可能想看一下
tpl,这是一个简单的C二进制序列化库。
int fwriteStudent(Student *s, FILE *fp);
,并记得在修改结构定义时更新该函数。 - Williham Totland