如何使用包含多个其他结构的结构,包括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;
}
答案 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);