2011-08-17 2 views
2

나는 이런 식으로 뭔가를 파일로 저장하는 방법 :동적 구조체이보다 사실 더 복잡한 구조체를

typedef struct _sample { 
    unsigned char type; 
    char *name; 
    test *first; 
} sample; 
typedef struct _test { 
    test *prev; 
    test *next; 
    char *name; 
    int total; 
    test_2 **list; 
} test; 
typedef struct _test_2 { 
    char *name; 
    unsigned int blabla; 
} test_2; 
sample *sample_var; 

나는 백업 파일에이 구조체를 원하고 후 복원.

나는 또한 fwrite(sample_var, sizeof(sample), 1, file_handle);으로 시도하지만 실제 크기는 실제 크기가 아니라 잘못된 크기를 반환하는 sizeof(sample)입니다.

크기를 모르더라도 & 파일로 복원하는 방법이 있습니까?

+0

@OP 저희에게 알려주세요. – cnicutar

답변

4

직렬화하려고하거나 구조체가 marshal입니다. 데이터가 fwrite 일 수는 없습니다 (포인터가 가장 확실한 마개입니다). 포인터가이라는 포인터를 파일에 저장하는 경우 (포인터가 원래의 프로그램 외부에서 의미가 없으므로) 과 비교할 때 sizeof 문제는 실제로 사소합니다.

사용자 고유의 직렬화/직렬화 해제 함수를 정의해야합니다. 자신의 간단한 형식을 사용하거나 JSON, XML, XDR 또는 이와 비슷한 것을 사용할 수 있습니다.

요즘 어쨌든 모든 분노가 있기 때문에 개인적으로 JSON을 사용할 것입니다.

제쳐두고, 여기에 C FAQ은 막연하게 사용자의 질문에 링크되어 있습니다 (이는 상호 운용성 문제에 대해 설명 함).

0

sizeof (샘플)가 잘못되지 않았습니다. char의 크기와 두 개의 포인터가 반환됩니다. 이러한 재귀 적 데이터 형식을 저장해야하는 경우 수동으로 포인터 역 참조를 따라야합니다.

+0

"두 개의 포인터가 뒤 따르는 char의 크기를 반환합니다"** 그리고 컴파일러가 마지막 멤버 이후에 멤버 사이에 삽입하도록 선택한 모든 패딩 바이트 ** – pmg

+0

물론 올바른 것입니다 : "char의 크기 by two pointers "는 반드시 char과 두 포인터의 크기의 합계가 아닙니다. 다양한 컴파일러 종속 정렬 제약 조건, 패킹 지시문, 아키텍처 지원 등이 다릅니다. –

0

실제로 구조체를 저장하고 포인터가 가리키는 부분이 포인터가 아니라 포인터 인 것 같습니다.

포인팅 할 데이터의 크기를 결정하는 로직을 작성하고 포인터 대신 파일에 데이터를 쓸 필요가 있습니다.

1

이러한 구조를 파일에 저장하는 쉬운 방법은 없습니다. 예를 들어, sample.name 필드의 크기는 아키텍처에 따라 4이며, 저장하려는 내용은 sample.name이 가리키는 메모리의 내용입니다.

다음은 이러한 작업을 수행하는 샘플 코드입니다. 전체 구조를 저장하려면 프로세스를 복제해야합니다.

아이디어는 다음 구조체의 크기를 저장 한 다음 내용을 기록하는 것입니다. 파일에서 정보를 얻으려면 크기를 읽은 다음 데이터를 가져옵니다.

관련 문제