Mmap访问文件内容并执行算术运算

时间:2017-11-22 13:37:22

标签: c memory-mapped-files memory-mapping

在本期here中有人询问如何使用文件进行位移,建议的方法是使用mmap。

现在这是我的mmap:

#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>

extern int errno;

int main(int argc, char *argv[]) {
    int fd;
    void *mymap;
    struct stat attr;

    char filePath[] = "test.txt";
    fd = open(filePath, O_RDWR);
    if (fd == -1) {
        perror("Error opening file");
        exit(1);
    }
    if(fstat(fd, &attr) < 0) {
        fprintf(stderr,"Error fstat\n");
        close(fd);
        exit(1);
    }
    mymap = mmap(0, attr.st_size, PROT_READ|PROT_WRITE, MAPFILE|MAP_SHARED, fd, 0);

    if(mymap == MAP_FAILED) {
        fprintf(stderr, "%s: Fehler bei mmap\n",strerror(errno));
        close(fd);
        exit(1);
    }

    if (munmap(0,attr.st_size) == -1) {
        fprintf(stderr, "%s: Error munmap\n",strerror(errno));
        exit(0);
    }
    if (close(fd) == -1) {
        perror("Error while closing file");
    }
    exit(0);
}

如何访问mmap内的数据?我怎样才能执行位移或其他算术运算,如乘法或加法或子操作等?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将mymap强制转换为您要使用的类型,并执行操作,就像您在内存中工作一样。

例如,在if (munmap(0,attr.st_size) == -1) {之前

char *str = (char *)mymap;
int i;
for(i=0 ; i<attr.st_size ; i++) {
    str[i] += 3; // add 3 to each byte in the file
}

for(i=0 ; i<attr.st_size - 1 ; i+=2) {
    str[i] *= str[i+1]; // multiply "odd" chars with the next one
    str[i] >>= 2;       // shift 2 (divide by 4)
}

关闭地图&amp; fd,文件已根据上述操作进行了更改。