【问题标题】:Cannot read struct from binary file无法从二进制文件中读取结构
【发布时间】: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


【解决方案1】:

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

至于指针,它不会像其他人指出的那样起作用,因为指针是地址,而不是实际的相关数据。

您想在开始读取文件之前先查找 sizeof(fileheader)。

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

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2017-02-02
    • 2020-05-06
    相关资源
    最近更新 更多