C - 从二进制文件读入任何结构

C - Reading from binary file into any struct

我找了很多,但找不到任何问题的答案。

我在 C 上构建我自己的列表库。我的想法是处理所有可能类型的数据,所以我使用 void 指针。

首先,这是我的清单。

文件 - node.h

struct Node{
    void *data;
    Node *next;
};

我创建了一些随机结构来测试我的方法,例如添加、删除、写入等,并且工作正常。

文件 - test.cpp

struct telfList{
    int telf;
    char name;
};
struct calendar{
    char month[5];
};

这是我将结构写入文件的地方。

bool saveToFile(struct Node *list, char *fileName){
    FILE *file = fopen(fileName, "wb");
    if(file == NULL){
        return false;
    }
    struct Node *aux = list;    
    while(aux != NULL){
        fwrite(&(aux->data), 1, sizeof(aux->data), file);
        aux = aux->next;
    }    
    fclose(file);
    return true;
}

我的问题来了。 我想再次读取该文件并将信息存储回列表,它必须与每种类型的结构一起使用,因为在这个测试中有 telfList 和日历,但将来可能会有敌人、玩家或其他任何东西。 我不知道如何通过param将数据类型传递给函数或如何通过void指针传递fread。

我知道这个函数是错误的,我现在就是这样,我证明了我所知道的,我在 Whosebug 上阅读了数百个问题,但没有人知道这个 doubt/problem

在这个例子中,我试图读取文件并用数据填充 telfList 的结构。

bool loadFromFile(struct Node **list, void* data, char *fileName){
    FILE *file = fopen(fileName, "rb");
    struct Node *aux = *list;
    if(file == NULL){
        return false;
    }
    data = fread(fileName, sizeof(*data), 1, file);
    createNewList(list, data);
    fclose(file);
    return true;
}

这就是我创建列表的方式。

void createNewList(struct Node **list, void* data){
    (*list) = createNode(data);
}
struct Node* createNode(void* data){
    struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

我试图详细解释它,但如果需要更多代码部分,请告诉我。 谢谢。

编辑:感谢大家的回答,我一直在研究序列化,你的建议很有帮助。

将结构序列化为二进制文件(或任何其他形式)是单独库的单独任务。不要将它与您的列表库混合使用。

对于序列化,我建议使用一些第 3 方库,例如 protobuf-c。即使您不能在您的项目中使用它,也请检查它以了解数据序列化的基本概念。