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
。即使您不能在您的项目中使用它,也请检查它以了解数据序列化的基本概念。
我找了很多,但找不到任何问题的答案。
我在 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
。即使您不能在您的项目中使用它,也请检查它以了解数据序列化的基本概念。