xcode c++好用的删除注释或指定字符串的函数
来源:互联网 发布:c语言教学入门视频 编辑:程序博客网 时间:2024/05/17 02:53
#include <stdio.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/mman.h>#include <unistd.h>#include <sys/dir.h>#include <map>#include <string>#include <fstream>using namespace std;#define NULLCHAR 32 //ascii字符的32表示空字符//删除注释.path:文件路径全名void delComments(const char *path);//判断是否为目录.path:文件路径全名bool isDir(const char* path);//删除文件夹下所有.c, cpp, .h的注释void delComInDir(const char *path);//删除文件夹下所有.c, cpp, .h的注释,这是递归方法void delComInDir(const char *path, int recursive);//取文件名的后缀名const char *getSuffix(const char *path);//取子串char* substr(const char*str, unsigned long start, unsigned long end);//删除注释类型namespace CommentType{ //删除"特定函数".funStr:函数名称 void delFun(const char *funStr, unsigned char *buffer, unsigned long size); //删除”特定单行字符”注释.str:字符 void delOtherSigle(const char *funStr, unsigned char *buffer, unsigned long size); //删除"/**/"型注释 void delMuliCom(unsigned char *buffer, unsigned long size); //删除"//"型注释 void delSigleCom(unsigned char *buffer, unsigned long size); //批量替换.oriStr:要替换的字符串, dstStr:替换后的字符串 void replace(const char *oriStr, const char *dstStr, unsigned char *buffer, unsigned long size);}int main(int argc, const char * argv[]){ delComInDir("/Users/zctech/Desktop/test"); printf("操作完成"); return 0;}//删除注释.path:文件名void delComments(const char *path){ 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; } CommentType::delSigleCom(start, sb.st_size);// CommentType::delFun("CCLog", start, sb.st_size);// CommentType::delFun("CCLOG", start, sb.st_size);// CommentType::delOtherSigle("#pragma", start, sb.st_size);// CommentType::delFun("zctech::ZCLOGI", start, sb.st_size);// CommentType::delFun("ZCLOGI", start, sb.st_size); close(fd); munmap(start, sb.st_size); /* 解除映射 */ }//判断是否为目录.path:文件路径全名bool isDir(const char* path){ struct stat st; lstat(path, &st); return 0 != S_ISDIR(st.st_mode);}//删除文件夹下所有.c, cpp, .h的注释void delComInDir(const char *path){ unsigned long len; char temp[1024 * 1024]; //去掉末尾的'/' len = strlen(path); strcpy(temp, path); if(temp[len - 1] == '/') temp[len -1] = '\0'; if(isDir(temp)) { //处理目录 int recursive = 1; delComInDir(temp, recursive); } else //输出文件 { //找出.h和.cpp文件 if(0 == strcmp("h", getSuffix(temp)) || 0 == strcmp("cpp", getSuffix(temp)) || 0 == strcmp("c", getSuffix(temp))) { printf("%s\n", temp); delComments(temp); } } }//遍历文件夹de递归函数void delComInDir(const char *path, int recursive){ DIR *pdir; struct dirent *pdirent; char temp[1024 * 1024]; pdir = opendir(path); if(pdir) { while((pdirent = readdir(pdir))) { //跳过"."和".." if(strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0) continue; sprintf(temp, "%s/%s", path, pdirent->d_name); //当temp为目录并且recursive为1的时候递归处理子目录 if(isDir(temp) && recursive) { delComInDir(temp, recursive); } else { //找出.h和.cpp文件 if(0 == strcmp("h", getSuffix(temp)) || 0 == strcmp("cpp", getSuffix(temp)) || 0 == strcmp("c", getSuffix(temp))) { printf("%s\n", temp); delComments(temp); } } } } else { printf("opendir error:%s\n", path); } closedir(pdir);}//求子串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;}//取文件名的后缀名const char *getSuffix(const char *path){ char *ptr; long pos; ptr = strrchr(path, '.'); //最后一个出现c的位置 if(NULL == ptr) { return ""; } pos = ptr - path; //用指针相减 求得索引 return substr(path, pos + 1, strlen(path));}//删除"//"型注释void CommentType::delSigleCom(unsigned char *buffer, unsigned long size){ //如果要删除但行注释先要删除多行注释/**/ CommentType::delMuliCom(buffer, size); unsigned long i = 0; bool isCom = false; bool isStr = false; while (i < size) { if(!isStr && '/' == *(buffer + i) && '/' == *(buffer + i + 1)) { isCom = true; } else if(!isStr && '\n' == *(buffer + i)) { isCom = false; } else if(!isCom && !isStr && '\"' == *(buffer + i) && '\\' != *(buffer + i - 1)) { isStr = true; } else if(!isCom && isStr && '\"' == *(buffer + i) && '\\' != *(buffer + i - 1)) { isStr = false; } if('\n' == *(buffer + i)) {isStr = false;} //移除注释 if (isCom && !isStr) { *(buffer + i) = 32; } i++; }}//删除"/**/"型注释void CommentType::delMuliCom(unsigned char *buffer, unsigned long size){ //判断是否为 【/**/】 型注释, 注意当是字符串的时候不替换 unsigned long i = 0; bool isCom = false; bool isStr = false; while (i < size) { if(!isStr && '/' == *(buffer + i) && '*' == *(buffer + i + 1)) { isCom = true; } else if(!isStr && '*' == *(buffer + i) && '/' == *(buffer + i + 1)) { isCom = false; *(buffer + i) = *(buffer + i + 1) = 32; } else if(!isCom && !isStr && '\"' == *(buffer + i) && '\\' != *(buffer + i - 1)) { isStr = true; } else if(!isCom && isStr && '\"' == *(buffer + i) && '\\' != *(buffer + i - 1)) { isStr = false; } if('\n' == *(buffer + i)) {isStr = false;} //移除注释 if (isCom && !isStr) { *(buffer + i) = 32; } i++; }}//删除”特定单行字符”注释.str:字符void CommentType::delOtherSigle(const char *funStr, unsigned char *buffer, unsigned long size){ //判断是否为#pragma mark注释 unsigned long i = 0; bool isCom = false; bool isStr = false; while (i < size) { if(!isStr && 0 == strcmp(funStr, substr((char *)buffer, i, i + strlen(funStr))) ) { isCom = true; } else if(!isStr && '\n' == *(buffer + i)) { isCom = false; isStr = false; } else if(!isCom && !isStr && '\"' == *(buffer + i)) { isStr = true; } else if(!isCom && isStr && '\"' == *(buffer + i)) { isStr = false; } //移除注释 if (isCom && !isStr) { *(buffer + i) = 32; } i++; } }//删除"特定函数".funStr:函数名称void CommentType::delFun(const char *funStr, unsigned char *buffer, unsigned long size){ //判断是否为ZCLOGI函数注释 unsigned long i = 0; bool isStr = false, isFun = false; int left = 0, right = 0; //左右括号 while (i < size) { if(!isStr && 0 == strcmp(funStr, substr((char *)buffer, i, i + strlen(funStr))) ) { isFun = true; } else if(!isFun && !isStr && '\"' == *(buffer + i)) { isStr = true; } else if(!isFun && isStr && '\"' == *(buffer + i)) { isStr = false; } if(isFun && '(' == *(buffer + i)) { left++; } else if(isFun && ')' == *(buffer + i)) { right++; if(left == right) { *(buffer + i) = NULLCHAR; isFun = false; } } //移除注释 if (isFun && !isStr) { *(buffer + i) = NULLCHAR; } i++; }}//void myreplace(const string& filename,const string& tofind,const string& toreplace)//{// ifstream fin(filename.c_str(),ios_base::binary);// string str(1024*1024*2,0);// fin.read(&str[0],2*1024*1024);// fin.close();// ofstream fout(filename.c_str(),ios_base::binary);// string::size_type beg=0,pos,find_size=tofind.size(),replace_size=toreplace.size();//// while((pos=str.find(tofind,beg))!=string::npos)// {// fout.write(&str[beg],pos-beg);// fout.write(&toreplace[0],replace_size);// beg=pos+find_size;// }// fout.write(&str[beg],strlen(str.c_str())-beg);// fout.close();//}////////批量替换.oriStr:要替换的字符串, dstStr:替换后的字符串//void CommentType::replace(const char *oriStr, const char *dstStr, unsigned char *buffer, unsigned long size)//{// //判断是否为ZCLOGI函数注释// unsigned long i = 0;// bool isStr = false, canReplace = false;// int left = 0, right = 0; //左右括号//// while (i < size)// {// if(!isStr && 0 == strcmp(oriStr, substr((char *)buffer, i, i + strlen(oriStr)))//// )// {// canReplace = true;// unsigned long index = 0;// while (index < strlen(oriStr))// {// *(buffer + i + index) = *(dstStr + index);// index++;// }// }// else if(!canReplace && !isStr && '\"' == *(buffer + i))// {// isStr = true;// }// else if(!canReplace && isStr && '\"' == *(buffer + i))// {// isStr = false;// }////// if(canReplace && '(' == *(buffer + i))// {// left++;// }// else if(canReplace && ')' == *(buffer + i))// {// right++;// if(left == right)// {// *(buffer + i) = NULLCHAR;// canReplace = false;// }// }//// //移除注释// if (canReplace && !isStr)// {// *(buffer + i) = NULLCHAR;// }//// i++;// }//}
0 0
- xcode c++好用的删除注释或指定字符串的函数
- C 可指定长度的字符串函数
- Editplus 正则表达式 删除含有指定字符串的行 删除注释
- 批量删除Xcode中代码的注释
- 用C语言实现在一个链表删除指定的一个或多个元素
- C学习笔记--在字符串中删除指定的字符
- c语言超强删除注释的函数(linux、mac)
- 删除全部指定的字符串
- 删除指定的字符串方法
- xcode object c 函数注释
- iOS:Xcode注释的用法---Objective C
- python删除指定类型(或非指定)的文件
- 好用的注释方法
- 好用的Xcode插件
- Xcode好用的插件
- 好用的xcode插件
- Xcode好用的插件
- 删除文件指定字符串之间的文字
- Linux 原始套接字抓包实例
- Android开发精要 重读 + xmind笔记(2)
- CF 237
- JDBC通过SSH Tunnel连接MySQL数据库
- 资源XML文件定义
- xcode c++好用的删除注释或指定字符串的函数
- Android中ViewFlipper详解
- 【人文】第一部分要小心自称“秉性不好”的人
- 2014/01-2014/03开发总结一
- Struts2学习笔记(3)——Result的4中类型配置
- 浙大2012上机 PAT 1031. Hello World for U (20)
- 用python编写脚本实现备份文件
- 测试人员如何更快的学习
- 黑马程序员 android App