如何正确阅读结构

How to read structs properly

我希望有人能帮助我。我正在尝试从下面读取包含一定数量结构的文件:

struct query {
    int key;
    char surname[16];
    char name[16];
    char patronymic[16];
    char subject[16];
    int grade;
}s;

我需要使用 mmap() 从文件中读取一些数据,例如打印所有具有相同主题和年级的结构,或打印具有特定键的查询。

在任何其他情况下,我会使用 fopen()fread() 来使用我的结构读取文件。像这样:

FILE *inputFile;
inputFile = fopen("database.dat", "rb");
    while(fread(&s, sizeof(s), 1, inputFile) == 1) {
        printf("\nKey: %d", s.key);
        printf("\nName: %s", s.name);
        printf("\nSurname: %s", s.surname);
        printf("\nPatronymic: %s", s.patronymic);
        printf("\nSubject: %s", s.subject);
        printf("\nGrade: %d", s.grade);
    }

但是我无法理解mmap()所以我有几个问题:

  1. 如何首先用我的文件初始化 mmap() 我想像这样,但我不确定(假设我知道多少文件中的结构,让它成为 amount 并且 fd 是我正确的文件描述符)。
mmap(NULL, amount*sizeof(s), PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0); 

还有我将其分配给什么类型的变量以便我可以使用它?

  1. 如何遍历映射文件中的所有结构并比较它们的字段? 通常(使用 fread())我只会做嵌套循环。但是我不知道在映射的情况下该怎么做。
  2. 是否可以在不知道结构数量的情况下 mmap() 文件? 在第一个问题中,我假设我知道文件长度 (amount*sizeof(s))。我可以在不知道 amount 的情况下映射文件吗?

如果我的术语听起来不对,我很抱歉,我的英语不是很好。

mmap() 可以将文件视为在内存中。 而且您不需要知道文件大小。 请参阅下面的示例代码:

    fd = open(filename, O_RDWR);
    fstat(fd, &buf);
    t = (struct query *)mmap(NULL, buf.st_size, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
    for(i = 0; i < buf.st_size/sizeof(struct query); i++){
        printf("\nKey: %d", t[i].key);
        printf("\nName: %s", t[i].name);
        printf("\nSurname: %s", t[i].surname);
        printf("\nPatronymic: %s", t[i].patronymic);
        printf("\nSubject: %s", t[i].subject);
        printf("\nGrade: %d", t[i].grade);
    }
    close(fd);