无法从二进制文件

时间:2017-10-29 22:11:39

标签: c struct binaryfiles

我试图将二进制文件的内容读入结构体,但每次打印出结构体的内容时,都会得到一个非常奇怪的输出。下面是我要设置的结构:

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定义为:

typedef enum _SEX {MALE = 'M', FEMALE = 'F', OTHER = 'O'} 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

名称甚至没有显示,年龄设置为错误的数字。我认为这可能是由于填充,所以我尝试使用

fread(&myStudent.name, sizeof myStudent.name, 1, file);
fread(&myStudent.age, sizeof myStudent.age, 1, file);

这样它可以根据需要读取每个单独的元素和焊盘。但是,我得到相同的输出。当我运行hexdump来查看我正在处理的是什么时,这就是出现的结果:

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  |L@....D...AJoe..|
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  |...33s@....n...B|
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  |....@@....x...B.|
00 00 00 41 4a 01 00 00  43                       |...AJ...C|

任何帮助都会非常感激 - 我一直坚持这个功能。

1 个答案:

答案 0 :(得分:0)

根据文件类型,前几个字节可以是文件头,这里可以存储信息,如版本号,数据长度等。

至于指针,由于指针是地址,而不是实际的相关数据,因此不会像其他人那样指出。

在开始阅读文件之前,您希望fseek到sizeof(fileheader)。

还要小心结构在C中填充,并且在结构中声明元素的顺序可能不是编译器为其决定的顺序。