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

时间:2016-11-02 20:27:39

标签: c list struct readfile void-pointers

我一直在寻找很多,但无法找到问题的答案。

我在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。

我知道这个功能是错的,我现在已经知道了,我证明了我所知道的,我在这里读了100个问题,而且没有人有这个疑问/问题

在这个例子中,我试图读取文件并用数据填充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;
}

我试图详细解释它,但如果需要更多的代码部分只是说我。 谢谢。

编辑:感谢大家的回答,我一直在研究序列化,你的提示非常有帮助。

1 个答案:

答案 0 :(得分:0)

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

对于序列化,我建议使用像protobuf-c这样的第三方库。即使您不能在项目中使用它,也要检查它以了解数据序列化的基本概念。