【发布时间】:2021-02-01 08:42:08
【问题描述】:
我希望有人可以帮助我。我正在尝试从下面读取包含一些结构的文件:
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()? 我想象这样的事情,但我不确定(假设我知道文件中有多少结构,让它成为amountfd是我的正确文件描述符)。
mmap(NULL, amount*sizeof(s), PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
还有我将它分配给什么类型的变量以便我可以使用它?
-
如何遍历映射文件中的所有结构并比较它们的字段? 通常(使用
fread())我只会做嵌套循环。但我不知道在映射的情况下该怎么做。 -
是否可以在不知道结构数量的情况下创建
mmap()文件? 在第一个问题中,我假设我知道文件长度 (amount*sizeof(s))。我可以在不知道amount的情况下映射文件吗?
如果我的术语听起来不对劲,我很抱歉,我不太擅长英语。
【问题讨论】:
-
“我想像这样” - 然后下一步是尝试一下,看看会发生什么。另外,请不要标记垃圾邮件。 C 还是 C++?
-
你的文件是一个结构体数组,那你觉得应该是什么类型呢?
-
mmap有一个参考页面,其中记录了它的所有参数是什么,并解释了如何使用它们。你读过mmap的文档吗?如果是这样,您不清楚mmap文档的哪一部分?如果没有,您应该先阅读它,如果您不清楚文档中的某些内容,请提出问题。 -
1) 我正在使用 C 语法,但我正在使用
g++进行编译,因此 C++ 代码也是可以接受的。 2)感谢您的澄清,我不知道是结构数组。 -
当您使用 C++ 编译器时,请将其标记为 C++。在 C 和 C++ 中,您需要做一些不同的事情,例如强制转换。我删除了 C 标签。