【问题标题】:How to read structs properly如何正确读取结构
【发布时间】: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(),所以我有几个问题:

  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的情况下映射文件吗?

如果我的术语听起来不对劲,我很抱歉,我不太擅长英语。

【问题讨论】:

  • “我想像这样” - 然后下一步是尝试一下,看看会发生什么。另外,请不要标记垃圾邮件。 C 还是 C++?
  • 你的文件是一个结构体数组,那你觉得应该是什么类型呢?
  • mmap 有一个参考页面,其中记录了它的所有参数是什么,并解释了如何使用它们。你读过mmap 的文档吗?如果是这样,您不清楚mmap 文档的哪一部分?如果没有,您应该先阅读它,如果您不清楚文档中的某些内容,请提出问题。
  • 1) 我正在使用 C 语法,但我正在使用 g++ 进行编译,因此 C++ 代码也是可以接受的。 2)感谢您的澄清,我不知道是结构数组。
  • 当您使用 C++ 编译器时,请将其标记为 C++。在 C 和 C++ 中,您需要做一些不同的事情,例如强制转换。我删除了 C 标签。

标签: c++ memory struct mmap


【解决方案1】:

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

【讨论】:

  • 我不知道我的文件充当结构数组。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2018-12-29
  • 2021-11-16
  • 2019-06-12
  • 2015-09-05
  • 1970-01-01
相关资源
最近更新 更多