如何正确阅读结构
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()
所以我有几个问题:
- 如何首先用我的文件初始化
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);
我希望有人能帮助我。我正在尝试从下面读取包含一定数量结构的文件:
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);