您的位置:首页 > 运维架构 > Linux

c/c++ 替换文本文件中的字符串函数【方法二】linux、mac版本

2014-03-25 11:19 429 查看
#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
= 0;                          
//字串最后加上0
    return stbuf;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  控制台 map path