C中嵌套结构的展平和转储

C中嵌套结构的展平和转储,c,pointers,struct,dump,C,Pointers,Struct,Dump,如何将包含多个其他结构的结构(bool、int等)展平为文本形式 struct Person { struct eye_data eyes; struct nose_data nose; struct ear_data ear; int height; int weight; bool alive; } 我操作的场景是:假设人员A希望通过他们创建和使用的结构发送给人员B,但结构的单个配置太多,无法通过电子邮件或其他方式发送

如何将包含多个其他结构的结构(bool、int等)展平为文本形式

struct Person {
      struct eye_data eyes;
      struct nose_data nose;
      struct ear_data ear;
      int height;
      int weight;
      bool alive;
}
我操作的场景是:假设人员A希望通过他们创建和使用的结构发送给人员B,但结构的单个配置太多,无法通过电子邮件或其他方式发送

如何编写转储函数,以便能够将所有结构信息写入一个文本文件,该文件稍后可以被另一个程序解析并读入,从而创建一个结构

另外,如果struct Person包含指向struct的指针,这将如何改变,即:

struct Person {
      struct eye_data *eyes;
      struct nose_data *nose;
      struct ear_data *ear;
      int *height;
      int *weight;
      bool alive;
}

如果所讨论的结构不包含指针,并且其中包含的所有结构都不包含指针(固定大小的数组可以,包括固定大小的字符串),则可以按原样将其写入磁盘:

struct Person person;

// not shown: populate fields of person

int f = open("/tmp/personfile", O_WRONLY | O_CREAT);
if (f == -1) {
    perror("open failed");
    exit(1);
}
int written = write(f, &person, sizeof(person));
if (written == -1) {
    perror("write failed");
    close(f);
    exit(1);
} else if (written != sizeof(person)) {
    fprintf(stderr, "wrote %d bytes, expected %d\n", written, sizeof(person));
}
close(f);
然后将其读回:

struct Person person;

int f = open("/tmp/personfile", O_RDONLY);
if (f == -1) {
    perror("open failed");
    exit(1);
}
int read = write(f, &person, sizeof(person));
if (read == -1) {
    perror("read failed");
    close(f);
    exit(1);
} else if (read != sizeof(person)) {
    fprintf(stderr, "read %d bytes, expected %d\n", written, sizeof(person));
}
close(f);
这是假设您在写它的同一台机器上读回它。如果它被移动到另一台机器上,您需要担心数字字段的尾数和填充的差异,这取决于源机器和目标机器的体系结构

请记住,这是以二进制格式编写结构。如果要以可读文本格式写入,或者如果需要担心指针,则需要使用
fprintf
将每个字段写入文件,并使用
fscanf
以您定义的顺序和方式将其读回

一个简短的例子:

// writing
fprintf(f,"%d\n%d\n%d\n",person.height,person.weight,(int)person.alive);

// reading
fscanf(f,"%d\n%d\n%d\n",&person.height,&person.weight,(int *)&person.alive);

您想要的是泛型序列化,请看这里:不要忘记提及填充(以及某些数字类型的大小),这在
x86
x86_64
@FelixPalmen之间已经有所不同,谢谢。对于带有指针的情况,您将如何编写结构字段?i、 e person->eyes,person->nose和person->ears?@SuryaRam您必须深入研究这些结构,并使用
fprintf
fscanf
读取/写入它们各自的组件。