gpt4 book ai didi

c - 在 C 中展平和转储嵌套结构

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:33 24 4
gpt4 key购买 nike

如何将包含多个其他结构( bool 型、整数型等)的结构扁平化为文本形式?

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

我操作的场景是:假设 A 想将他们创建和使用的结构发送给 B,但是该结构的各个配置太多,无法通过电子邮件或其他方式发送。

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

此外,如果 Person 结构包含指向结构的指针,这将如何改变,即:

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

关于c - 在 C 中展平和转储嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31593735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com