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后,按照上面的操作,文件已经改变了
本期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后,按照上面的操作,文件已经改变了