Я много искал, но не смог найти ответа на мою проблему.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 и календарь, но, возможно, в будущем это враги, игроки или что-то еще. Я не знаю, как передать тип данных функции по параметру или как передать fread указателем void.
Я знаю, что функция не так, то, как у меня сейчас, я доказал все, что я знаю, что я читал, как сто вопросов здесь ан StackOverflow, но никто не имеет это сомнение/проблемы
В этом примере я Я пытаюсь прочитать файл и заполнить структуру 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;
}
Я попытался объяснить это подробно, но если вам нужно больше частей кода, просто скажите мне. Спасибо.
EDIT: Спасибо всем за ответы, я изучал сериализацию, и ваши советы были очень полезными.
'sizeof (aux-> data)' in 'saveToFile()' - размер указателя 'void'. Вам нужно писать фактические данные. Думаю, вам нужно посмотреть «сериализацию». –
Синтаксис 'fread()' неверен. Это должно быть 'nread = fread (& buffer, sizeof (struct), 1, file);'. Прежде, буфер должен быть выделен или определен как 'struct buffer'. –
Не могли бы вы предоставить [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), чтобы обнаружить все ошибки? –