在本期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内的数据?我怎样才能执行位移或其他算术运算,如乘法或加法或子操作等?
谢谢!
答案 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,文件已根据上述操作进行了更改。