如何正确读取结构

问题描述

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

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);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...