функция mmap для массивов данных - PullRequest
0 голосов
/ 25 марта 2019

Предположим, у вас есть двоичный файл.Он состоит из двойников.Его размер достаточно мал, чтобы положить в память.Как прочитать все эти числа с помощью функции 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].

1 Ответ

1 голос
/ 27 марта 2019

Можно привести 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];
    }

Надеюсь, вы найдете это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...