如何将嵌套结构读/写到文件c?

如何将嵌套结构读/写到文件c?,c,C,我想将嵌套结构存储到.dat文件中,并在需要时在另一个文件中读取它 它说“读取文件时出现分段错误(内核转储) 我怎样才能解决这个问题 这些是结构: struct address { int code; char city[10]; }; struct student { char name[10]; struct address *ads; }; 这是写入的代码: struct student *person; if((person = malloc

我想将嵌套结构存储到.dat文件中,并在需要时在另一个文件中读取它

它说“读取文件时出现分段错误(内核转储)

我怎样才能解决这个问题

这些是结构:

struct address {
    int code;
    char city[10];
};

struct student {
    char name[10];
    struct address *ads;
};

这是写入的代码:

struct student *person;
    if((person = malloc(sizeof(*person))) == NULL) {
        printf("cannot allocate memory\n");
        return -1;
    }
    strcpy(person->name, "s1");
    if((person->ads = malloc(sizeof(*(person->ads)))) == NULL) {
        printf("cannot allocate memory to address\n");
        free(person);
        return -1;
    }
    person->ads->code = 1;
    strcpy(person->ads->city, "mumbai");
    FILE *file;
    if((file = fopen("file.dat", "wb")) == NULL) {
        printf("Could not open file.dat\n");
        free(person->ads);
        free(person);
        return -1;
    }
    fwrite(&person, sizeof(*person), 1, file);
    if(fwrite) {
        printf("written\n");
    }else{
        printf("not written\n");
    }
    fclose(file);
这是用于读取的代码:

    struct student *person;
    FILE *file;
    if((file = fopen("file.dat", "rb")) == NULL) {
        printf("Could not open file.dat\n");
        free(person);
        return -1;
    }
    fread(&person, sizeof(*person), 1, file);
    printf("cityname: %s\n", person->ads->city);
    fclose(file);

struct address
未“嵌套”在
struct student
中;
struct student
包含指针,而不是嵌套结构

使用
write
无法有意义地写入指针:您可以这样做,但结果仅在指向的对象的生命周期内有意义,并且仅在对象存在的过程中有意义。将数据写入外部文件的目的通常是为了在不确定的将来以及在另一个过程中使用它,无论是对于指针来说,这是正确的


如果你想把一个像
struct address
这样的对象写入持久存储,你必须对数据进行序列化:也就是说,将它转换成一种格式,在这种格式中,可以写入多个对象,并清楚地指出它们之间的关系。你会发现许多序列化框架都对这个术语进行了一些研究,但是se对于直接实现来说可能足够简单。毫无疑问,这是本家庭作业的重点。

除了rici的优秀答案之外,我还鼓励您研究数据序列化框架。手工编写序列化代码既繁琐又容易出错,而且一旦您开始扩展文件格式ich可能会在某个时候发生。有几种有用的方法,例如,或

请阅读“序列化”“并报告这个概念在多大程度上是你想要的,以及它在多大程度上已经解决了你的问题。技术表达应该让你的问题更切题。但是,嗯,你的问题的主体,与标题相反,只是讨论了一个错误。。。所以可能不是。(1)你需要为
分配空间。(2)你需要将数据读入你分配的空间,而不是指针本身。你只写了
,而不是它的指针指向的任何东西。没有过多看你的代码,一个重要的问题就是将
传递给
弗瑞德()
fwrite()
person
已经是一个指针,因此您正在传递一个
struct student**
,可能会覆盖其他内容。此外,也不能保证结构的布局在不同的平台上是相同的。