【发布时间】:2017-10-29 22:11:38
【问题描述】:
我正在尝试将二进制文件的内容读入一个结构,但每次我打印出我的结构的内容时,我都会得到一个非常奇怪的输出。下面是我要设置的结构:
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|
任何帮助将不胜感激——我已经被这个功能卡住了一段时间。
【问题讨论】:
-
文件中有 6 个字节在名称开始之前。你确定你的布局正确吗?如果在尝试读取结构之前读取或查找 6 个字节会发生什么?您将需要对 `structs 中的指针做一些事情,您不能编写它们并期望阅读它们是有用的,您需要遍历列表并单独写入/读取每个字段,即无论如何,通常是最好的事情。
-
文件最初是如何创建的?此外,“课程”和“下一个”字段在您回读后将永远不会正确,因为它们是指针。
-
如何保存文件?
-
我认为文件不正确,“Fred”不是在文件的开头开始,这是不正确的。
标签: c struct binaryfiles