2016-11-02 4 views
0

Я много искал, но не смог найти ответа на мою проблему.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: Спасибо всем за ответы, я изучал сериализацию, и ваши советы были очень полезными.

+0

'sizeof (aux-> data)' in 'saveToFile()' - размер указателя 'void'. Вам нужно писать фактические данные. Думаю, вам нужно посмотреть «сериализацию». –

+0

Синтаксис 'fread()' неверен. Это должно быть 'nread = fread (& buffer, sizeof (struct ), 1, file);'. Прежде, буфер должен быть выделен или определен как 'struct buffer'. –

+0

Не могли бы вы предоставить [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), чтобы обнаружить все ошибки? –

ответ

0

Сериализация структур в двоичную (или любую другую форму) - отдельная задача для отдельной библиотеки. Не смешивайте его с библиотекой List.

Для сериализации я предлагаю использовать некоторую стороннюю библиотеку, такую ​​как protobuf-c. Даже если вы не можете использовать его в своем проекте, проверьте его, чтобы понять основные понятия сериализации данных.

Смежные вопросы