字符串批量添加_T()宏工具

  字符串批量添加_T()宏工具
  程序:AddTextMacro.exe (请不要直接使用迅雷下载)
  源代码下载:AddTextMacro.zip (请不要直接使用迅雷下载)
  注:VC6下编译通过
  
  一、前言:
  写了个小工具,可以批量为文件中的字符串添加_T()宏。由于水平有限,如果有错误,望海涵,并及时告知我。谢谢!
  qiujiejia@gmail.com
  二、调用如下:
  (1)为指定文件添加_T()宏
  CTextMacro::AddTextMacro("c:\\a.cpp");
  (2)撤消添加的_T()宏
  CTextMacro::Undo("c:\\a.cpp")
  三、CTextMacro类的代码,详细请看源代码工程!(我没有把类分成cpp和h两个文件,请自行修改) /************************************************* *************************** CTextMacro可以为文件里的字符串添加text宏_T() 一、原理:遍历文件中的字符,找到每对双引号,然后判断是否符合条件。 二、情况分析: 1.在找双引号的过程中,如果读入的双引号前面有一斜杠,说明是字符串里的\\,如: sprintf(buf,"ts\"ee"\ew"); 不处理,继续判断下一个字符 2.如果遇到换行,重新开始找一对双引号 3.当找到第一个双引号,记录其位置BeginPos,继续找第二个双引号,找到再记录其位置EndPos 这样就可以开始判断此双引号是否需要添加_T()宏 4.如果双引号前面已经有诸如_T() _TEXT() 的宏了,那我们就不处理此双引号。 情况一:有_T()宏 并且有可能不是紧挨着双引号,如: _T ( "jacky") ,有空格 情况二:有_TEXT()宏, 情况三:有__TEXT()宏, 情况四: 函数如 GET_T("PP") SET_TEXT("vv") 里面的_T 和 _TEXT 都不是宏,所以 这里最主要判断_T(or _TEXT) 的左边第一个字符来判断,代码里用到IsWord() 函数来完成此项工作 三、CTextMacro类的所有函数都是静态成员函数,没有成员变量。其实可以去掉类并转换成单独函数。 四、一些心得; 1.感觉最难的部分在判断双引号前面是否已经有TEXT宏了。修改了几种方法,认为现在此种 方法是比较好的。由于有多种情况需要判断,所以比较繁。但掌握规律了就好容易解决。 2.学到关于字符串反向搜索匹配的问题。 3.写字符串处理的代码还是要特别小心。比如:两句看似并列的代码,但换一下位置结果就不同了。 ************************************************** **************************/ #include using namespace std; #include class CTextMacro { public: /************************************************* *************************** 获取文件内容并放在一个string里 ************************************************** **************************/ static string GetFileString(const TCHAR* FilePath) { FILE* fp; fp = fopen(FilePath, "rb+"); if (!fp) return NULL; //获取文件字符串个数 fseek(fp,0,SEEK_END); UINT length=ftell(fp); rewind(fp); //获取文件文本 TCHAR* OldString; OldString=new TCHAR[(length+1)*sizeof(TCHAR)]; fread(OldString,1,length,fp); OldString[length]=NULL; string str=OldString; delete[] OldString; fclose(fp); return str; } /************************************************* *************************** 保存文件 ************************************************** **************************/ static bool SaveFile(const TCHAR* FilePath,string& str) { // IsModify=0; if (!BackupFile(FilePath)) return false; //保存文件 FILE* fp = fopen(FilePath, "wb+"); fwrite( str.c_str(),1,str.size(),fp); fclose(fp); return true; } /************************************************* *************************** 恢复文件。给定添加了_T()宏的文件的路径,函数会查找文件所在目录下是否有可用的备份并进行还原 ************************************************** **************************/ static BOOL Undo(TCHAR* FilePath) { if (-1==GetFileAttributes(FilePath)) return false; //获取备份文件夹路径 TCHAR NewFilePath[MAX_PATH]; GetPathWithoutFileName(FilePath,NewFilePath); _tcscat(NewFilePath,_T("BackUpRelpaceFiles\\")); //获取备份文件的路径 TCHAR FileName[100]; GetFileNameInPath(FilePath,FileName,sizeof(FileNam e)/sizeof(TCHAR)); _tcscat(NewFilePath,FileName); return CopyFile(NewFilePath,FilePath,false); } /************************************************* *************************** 备份文件 ************************************************** **************************/ static BOOL BackupFile(const TCHAR* FilePath) { //获取备份文件夹路径 TCHAR NewFilePath[MAX_PATH]; GetPathWithoutFileName(FilePath,NewFilePath); _tcscat(NewFilePath,_T("BackUpRelpaceFiles\\")); //假如NewFilePath文件夹不存在,则创建之 if (-1==GetFileAttributes(NewFilePath)) _mkdir( NewFilePath ); //获取备份文件的路径 TCHAR FileName[100]; GetFileNameInPath(FilePath,FileName,sizeof(FileNam e)/sizeof(TCHAR)); _tcscat(NewFilePath,FileName); return CopyFile(FilePath,NewFilePath,false); } /************************************************* *************************** 根据字符判断是否一个词 ************************************************** **************************/ static bool IsWord(TCHAR p) { if (( '0'FileStartPos && *p!='\n') //先比较后就--移动到前一个字符 { if (*p==' ') continue; //trace("去空格"); if (*p=='(') continue; //trace("去括号"); if (*p==' ') continue; //trace("去空格"); const TCHAR* pt; //先要判断有无 __TEXT() pt=p-5; if ( pt>=FileStartPos && _tcsncmp(pt,_T("__TEXT"),6)==0 ) { //判断宏的前面一个字符 if ( (pt--)>FileStartPos ) return IsWord(*pt) ? false : true; return true; } //判断有无 _TEXT() pt=p-4; if ( pt>=FileStartPos && _tcsncmp(pt,_T("_TEXT"),5)==0 ) { //判断宏的前面一个字符 if ( (pt--)>FileStartPos ) return IsWord(*pt) ? false : true; return true; } //判断有无 _T() pt=p-1; if ( pt>=FileStartPos && _tcsncmp(pt,_T("_T"),2)==0 ) { //判断宏的前面一个字符 if ( (pt--)>FileStartPos ) return IsWord(*pt) ? false : true; return true; } return false; } return false; } /************************************************* *************************** 判断双引号里面的内容是否为一个头文件 ************************************************** **************************/ static bool IsHeadFile(const TCHAR* p,const TCHAR* FileStartPos) { while((p--)>FileStartPos && *p!='\n') //先比较后就--移动到前一个字符 { if (*p==' ') continue; //trace("去空格"); p-=7; if ( p>=FileStartPos && _tcsncmp(p,_T("#include"),8)==0 ) return true; return false; } return false; } /************************************************* *************************** 最主要的函数。遍历文件中的字符,找到每对双引号,然后判断是否符合条件。 输入是常指针const TCHAR* OldString 输出是一个 string NewFile ************************************************** **************************/ static int AddTextMacro(const TCHAR* FilePath) { string NewFile; //保存修改后的文件字符串 const TCHAR* OldString; //指向原来文件的指针 string FileString=GetFileString(FilePath); if (FileString.size()==0) return -1; else OldString=FileString.c_str(); const TCHAR* pos=OldString; //遍历文件字符串的指针 const TCHAR* LastPos=OldString; //保存上一次的指针 int ReplaceNum=0; //累计插入_T()宏的个数 int FindNum=0; //找到的双引号个数 const TCHAR* BeginPos=NULL; //保存第一个双引号的位置 const TCHAR* EndPos=NULL; //保存第二个双引号的位置 //遍历所有字符找到每对需要添加_T()宏的双引号 for(;*pos;pos++) { //换行就重新设置双引号的个数 if (*pos=='\r' || *pos=='\n') { FindNum=0; //trace("换行"); continue; } //如果遇到双引号 if (*pos=='\"') { //双引号的前面是\号的话,表示字符串里的双引号,返回 if (*(pos-1)=='\\') { continue; } //累加双引号的个数 FindNum++; } else continue; //不是双引号,返回 //找到第一个双引号了 if (FindNum==1) { BeginPos=pos; //trace("找到第1个"); continue; } //找到第2个双引号了 EndPos=pos; //trace("找到第2个"); FindNum=0; //如果是头文件双引号,直接返回 if (IsHeadFile(BeginPos,OldString)) { continue; } //判断双引号前面是否已经有宏了 if (IsTextMapped(BeginPos,OldString)) { continue; } //累计替换的个数 ReplaceNum++; //insert strings to NewFile NewFile.append(LastPos,BeginPos-LastPos); NewFile+=_T("_T("); NewFile.append(BeginPos,EndPos-BeginPos+1); NewFile+=_T(")"); //保存位置 LastPos=pos+1; } //补上最后的文本 NewFile+=LastPos; if (ReplaceNum!=0) SaveFile(FilePath,NewFile); return 0; } };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值