二进制使用Struct数组成员保存结构(C)?

时间:2012-11-14 16:23:22

标签: c dynamic file-io struct

我目前正在开发一个使用这两个结构的程序:

//Struct to hold contact info about a friend
typedef struct
{
    char *firstName, *lastName;
    char *home, *cell;
} Friend;

//Struct to hold a list of friends and keep track of its size.
typedef struct
{
    Friend *listEntries;
    size_t listSize;
} FriendList;

Friend结构中的每个字符串成员都是动态分配的,listEntries内的FriendList数组也是如此。我正在尝试将FriendList保存为二进制记录,但是当我尝试使用fwrite()执行此操作然后使用fread()将其读回时,listEntries数组从文件中读取的FriendList为空。有没有办法保存像这样的动态结构?

编辑:我用来读/写结构的函数是:

void writeList(FriendList *fl, char* filename)
{
    FILE *fp = fopen(filename, "wb+");

    if(fp != NULL)
    {
        fwrite(fl, sizeof(FriendList), 1, fp);
    }

    fclose(fp);
}

void readList(FriendList *dest, char* filename)
{
    FILE *fp = fopen(filename, "rb");

    if(fp == NULL)
    {
        printf("oops...");
    }
    else
    {
        fread(dest, sizeof(FriendList), 1, fp);
    }

    close(fp);
}

1 个答案:

答案 0 :(得分:2)

您必须保存指针指向的数据,而不是指针本身。指针在你的进程之外是没有意义的,因为它现在存在,因此将指针值保存到磁盘意味着什么。

通常,您不能通过使用单个fwrite()转储结构来实现此目的,因为这不会遵循指针。

您需要创建一个实际的外部文件格式来使用,并编写代码来保存和加载它。我建议使用基于文本的格式,因为大多数数据都是文本。 Perhaps CSV