#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include<string>
#include<stdio.h>
#include <unistd.h>
#include <sys/dir.h>
#include <sys/stat.h>
#include <map>
using namespace std;
//求子串
char* substr(const char*str, unsigned long start, unsigned long end);
//替换文本. path:文件名, oriStr:将要替换的字符串、dstStr:替换的目的字符串
void replace(const char *path, const char *oriStr, const char *dstStr);
int main(int argc, char** argv)
{
replace("/Users/zctech/Desktop/test/test.cpp", "void", "MUSTN'T");
}
//替换文本. path:文件名, oriStr:将要替换的字符串、dstStr:替换的目的字符串
void replace(const char *path, const char *oriStr, const char *dstStr)
{
int fd = open(path, O_RDWR);
//获取文件大小
struct stat sb;
fstat(fd, &sb);
unsigned char *start = (unsigned char *)mmap(NULL, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if(start == MAP_FAILED) /* 判断是否映射成功 */
{
printf("映射失败,文件过大或者没有权限");
return;
}
string str = "";
unsigned long i = 0;
while (i < sb.st_size)
{
if(0 == strcmp(oriStr, substr((char *)start, i, i + strlen(oriStr))))
{
str += dstStr;
i += strlen(oriStr);
continue;
}
str += *(start + i);
i++;
}
close(fd);
munmap(start, sb.st_size); /* 解除映射 */
FILE *fp = fopen(path, "w");
fwrite(str.c_str(), strlen(str.c_str()), sizeof(char), fp);
fclose(fp);
}
//求子串
char* substr(const char*str, unsigned long start, unsigned long end)
{
unsigned long n = end - start;
static char stbuf[1024 * 1024];
strncpy(stbuf, str + start, n);
stbuf[n] = 0; //字串最后加上0
return stbuf;
}