2016-11-02 27 views
0

私はたくさんの見た目を見てきましたが、私の問題に対する答えは見つかりませんでした。C - バイナリファイルから任意の構造体への読み込み

私は自分のリストライブラリをC言語で構築しています。考えられるすべての型のデータで作業するので、私はvoidポインタを使用しています。

まず、これは私のリストです。

ファイル -

struct Node{ 
    void *data; 
    Node *next; 
}; 

node.h私は、このような、追加、削除、書き込み、およびより多くのとしての私のメソッドをテストし、正常に動作しているため、いくつかのランダムな構造を作成しました。

ファイル - 私はファイルへの構造体を作成するのはここ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 pointerによってfreadを渡す方法を知らない。

私は、その関数が間違っている知っているが、私は今それを持っているかで、私は私が知っているすべてを証明し、私はstackoverflowのエンここに百のような質問を読んだが、誰もがこの疑問を持っていない/問題

この例では、Iファイルを読み込み、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

'saveToFile()の' sizeof(aux-> data) 'は' void'ポインタのサイズです。あなたは実際のデータを書く必要があります。あなたは 'シリアライゼーション'を調べる必要があると思います。 –

+0

'fread()'の構文が正しくありません。 'nread = fread(&buffer、sizeof(struct )、1、file);'でなければなりません。以前は、バッファは 'struct buffer'として確保または定義されます。 –

+0

すべてのエラーを検出するために、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を提供できますか? –

答えて

0

バイナリ(または他の形式)へのシリアライゼーション構造は、別のライブラリの別のタスクです。 Listライブラリと混用しないでください。

シリアル化については、protobuf-cのようなサードパーティライブラリを使用することをお勧めします。プロジェクトで使用できない場合でも、データのシリアル化の基本的な概念を理解するためにチェックしてください。

関連する問題