2016-11-02 7 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와 calendar가 있지만 어쩌면 미래에 적, 플레이어 또는 다른 것이므로 모든 유형의 구조체와 함께 작동해야합니다. param에 의해 함수에 데이터 형식을 전달하는 방법이나 void 포인터로 fread를 전달하는 방법을 모르겠습니다.

내가 지금 얼마나 그 기능이 잘못 알고, 내가 알고있는 모든 증명, I에 유래 엔 여기 백 개 질문처럼 읽을했지만 아무도이 예에서는이 의심/문제

이 없습니다 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; 
} 

자세한 내용을 설명하려고했지만 더 많은 코드 부분이 필요하다고 생각합니다. 감사합니다.

편집 : Thx에 대한 답변을 위해, 나는 직렬화에 대해 연구 해왔고 귀하의 팁은 매우 도움이되었다.

+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과 같은 타사 라이브러리를 사용하는 것이 좋습니다. 프로젝트에서 사용할 수 없더라도 데이터 직렬화의 기본 개념을 이해하려면 확인하십시오.