我试图将二进制文件的内容读入结构体,但每次打印出结构体的内容时,都会得到一个非常奇怪的输出。下面是我要设置的结构:
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|
任何帮助都会非常感激 - 我一直坚持这个功能。
答案 0 :(得分:0)
根据文件类型,前几个字节可以是文件头,这里可以存储信息,如版本号,数据长度等。
至于指针,由于指针是地址,而不是实际的相关数据,因此不会像其他人那样指出。
在开始阅读文件之前,您希望fseek到sizeof(fileheader)。
还要小心结构在C中填充,并且在结构中声明元素的顺序可能不是编译器为其决定的顺序。