问题描述
我希望有人能帮助我。我正在尝试从下面读取包含一些结构的文件:
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()
,所以我有几个问题:
- 如何首先将文件初始化为
mmap()
?我想像这样的东西,但是我不确定(假设我知道文件中有多少结构,让是amount
,而fd
是我的属性文件描述符)。
mmap(NULL,amount*sizeof(s),PROT_WRITE | PROT_READ,MAP_SHARED,fd,0);
我还为它分配了什么类型的变量,以便可以使用它?
- 如何遍历映射文件中的所有结构并比较它们的字段?通常(使用
fread()
),我只会做嵌套循环。但是我不知道在映射情况下该怎么办。 - 是否可以在不知道结构量的情况下
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);