【问题标题】:C - Reading from binary file into any structC - 从二进制文件读入任何结构
【发布时间】:2017-03-16 07:28:27
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • sizeof(aux->data) in saveToFile()void 指针的大小。您需要编写实际数据。我认为您需要查找“序列化”。
  • fread() 的语法不正确。应该是nread = fread(&buffer,sizeof(struct <telfList/calendar>),1,file);。之前,缓冲区应分配或定义为struct <telfList/calendar> buffer
  • 您能否提供Minimal, Complete, and Verifiable example 以检测所有错误?

标签: c list struct readfile void-pointers


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多