mmap访问文件内容并进行算术运算

Mmap access file content and perform arithmetic operations

本期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 中的数据?以及如何执行位移或其他算术运算,如乘法、加法或减法等?

谢谢!

您可以将 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)
}

关闭map & fd后,按照上面的操作,文件已经改变了