在C

时间:2015-07-23 17:01:03

标签: 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;
}

我正在运行的场景是:Say Person A希望通过他们创建和使用的结构发送给Person B,但结构的各个配置太多,无法通过电子邮件或其他东西发送。

如何编写转储函数,以便能够说,将所有结构信息写入文本文件,稍后可以通过另一个程序解析,以便重新读取,以创建结构。

另外,如果struct Person包含指向结构的指针,那么它会如何改变,即:

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

1 个答案:

答案 0 :(得分:1)

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

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);