数据数组的 mmap 函数

mmap function for arrays of data

假设您有一个二进制文件。它由双人组成。它的大小足够小,可以放入内存中。如何使用 mmap 函数读取所有这些数字? 我试图取消引用输出指针。但它只是数据的第一个元素。要使用循环,如何控制数组元素的数量是非常重要的。

int main(int argc, char* argv[]) { // we get filename as an argument from the command line
    if (argc != 2)
        return 1;
    int fd = open(argv[1], O_RDWR, 0777);
    size_t size = lseek(fd, 0, SEEK_END);
    double m = 0;
    int cnt = 0; // counter of doubles
    void* mp = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
    if (mp == MAP_FAILED)
        return 1;
    double* data = mp;
    m += *data; // we want to count the sum of these doubles
    ++cnt;
    int ump_res = munmap(mp, sizeof(double));
    if (ump_res < sizeof(double))
        return 1;
    printf("%a\n", (m / (double)cnt)); // we output the average number of these doubles
    close(fd);
    return 0;
}

我希望在 stdout 中我们将得到文件中所有双打的平均值,其名称在 argv[1] 中给出。

可以将 void* 转换为 double* 。然后您可以迭代和处理元素:

void* mp = mmap(0, length, PROT_READ, MAP_PRIVATE, fd, 0);
    if (mp == MAP_FAILED) {
        close(fd);
        return 1;
    }
    double* data = (double*)mp;
    size_t cnt = length / sizeof(double);
    for (size_t i = 0; i < cnt; ++i) {
        m += data[i];
    }

希望对您有所帮助。