2017-10-29 5 views
0

구조체에 이진 파일의 내용을 읽으려고합니다. 그러나 구조체의 내용을 인쇄 할 때마다 꽤 이상한 결과가납니다.이진 파일에서 구조체를 읽을 수 없습니다

typedef enum _SEX {MALE = 'M', FEMALE = 'F', OTHER = 'O'} SEX; 

이 지금 내 기능과 같습니다 정의 과정 구조체와

struct student { 
    char name[32]; 
    unsigned int age; 
    SEX sex; 
    float gpa; 
    struct course *courses; 
    struct student *next; 
} 

: 다음은 구조체 내가 설정하려고대로

struct course { 
    char grade; 
    unsigned int number; 
    struct course *next; 
} 

그리고 SEX 정의 다음과 같습니다 :

void read_bin(char *filename){ 
    FILE *file; 
    struct student myStudent; 
    file = fopen(filename, "rb"); 
    if(file == NULL){ 
     printf("Unable to open file!"); 
     return; 
    } 
    fread(&myStudent, sizeof(struct student), 1, file); 
    printf("\nName: %s, Age: %d", myStudent.name, myStudent.age); 
    fclose(file); 
} 

이 이상한 출력을 받고 계속 : 잘못된 번호로 이름이 0

도 표시되지 연령 세트 :

나이. 이것은 패딩 때문일 수 있으므로 사용하려고 시도했습니다.

필요에 따라 각 요소와 패드를 읽습니다. 그러나, 나는 동일한 출력을 얻는다. 내가 정확히 내가 처리 된 것을보고 16 진 덤프를 실행하면,이 나온 것입니다 :

f0 0d 03 00 00 00 46 72 65 64 00 00 00 00 00 00 |......Fred......| 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00 00 00 00 00 00 1d 00 00 00 4d 00 00 00 cd cc |..........M.....| 
4c 40 01 00 00 00 44 02 00 00 41 4a 6f 65 00 00 |[email protected]| 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00 00 00 00 00 00 00 00 00 00 00 16 00 00 00 4d |...............M| 
00 00 00 33 33 73 40 03 00 00 00 6e 00 00 00 42 |[email protected]| 
dc 00 00 00 41 54 01 00 00 41 53 61 72 61 68 00 |....AT...ASarah.| 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00 00 00 00 00 00 00 00 00 00 16 00 00 00 46 00 |..............F.| 
00 00 00 00 40 40 03 00 00 00 78 00 00 00 42 dc |[email protected]@....x...B.| 
00 00 00 41 4a 01 00 00 43      |...AJ...C| 

어떤 도움을 크게 감상 할 수있다 - 나는 잠시이 기능에 붙어 있었어요. 처음 몇 바이트가 fileheader 될 수있는 파일 형식에 따라

+3

이름이 시작되기 전에 파일에 6 바이트가 있습니다. 레이아웃이 맞는지 확실합니까? 구조체를 읽기 전에 6 바이트를 읽거나 찾으면 어떻게됩니까? 구조체에서 포인터에 대해 뭔가를 할 필요가 있습니다. 구조체를 쓸 수없고 쓸모가 없을 것이라고 기대한다면, 목록을 탐색하고 각 필드를 개별적으로 쓰거나 읽어야합니다. 어쨌든 가장 좋은 방법입니다. –

+6

처음에 파일이 어떻게 생성 되었습니까? 또한 '코스'와 '다음'필드는 포인터이기 때문에 다시 읽은 후에는 올바르지 않습니다. – Serge

+0

어떻게 파일을 저장합니까? – BobRun

답변

0

가 여기에 정보 버전 번호와 같은 저장 될 수있는, 다른 사람처럼 작동하지 않습니다 데이터 등을 포인터에 관해서는

의 길이는 지적 포인터는 주소이기 때문에 실제 관련 데이터가 아닙니다.

파일 읽기를 시작하기 전에 sizeof (fileheader)를 확인하고 싶습니다.

구조체가 C로 채워져 있고 구조체의 요소를 선언 한 순서가 컴파일러가 결정한 순서가 아닐 수도 있습니다.

관련 문제