看《嵌入式操作系统设计与实现》时,书中用c来模仿面向对象设计,如定义一个对象时,方法是:
BEGIN_DEFINE_OBJECT(_OBJECT)
.....
....
END_DEFINE_OBJECT()
但这使得在source insight下不好查找_OBJECT的定义,于是写了个程序把所有文件中对象定义改回来,变成:
struct _OBJECT{
...
...
};
代码如下:
#include <iostream> #include <io.h> #include <fstream> #include <string> using namespace std; int main(int argc, char **argv) { long filehandle; _finddata_t fileInfo; filehandle=_findfirst(".\\*.*",&fileInfo); _findnext(filehandle,&fileInfo);//去除.和.. //string changedFileDir("changedFiles"); system("mkdir changedFiles");//新建目录,存放修改后的文件 //char tempDir[100]={".\\changedFiles\\"}; string searchStr1("BEGIN_DEFINE_OBJECT("),replaceStr1("struct "),searchStr2(")"),replaceStr2("{"),searchStr3("END_DEFINE_OBJECT()"),replaceStr3("};"); string::size_type pos=0; while(!_findnext(filehandle,&fileInfo)) { if(fileInfo.attrib!=_A_SUBDIR && strcmp(fileInfo.name,"change.exe"))//finlename:change.cpp { cout<<fileInfo.name<<endl; char tempDir[100]={".\\changedFiles\\"}; strcat(tempDir,fileInfo.name); char temp[200]; ifstream ifs;//这里放在内部定义,让它成为局部变量。如果放在外面定义,读多个文件时,只有第一个文件能被读(写)到。即使文件关闭也不行 ofstream ofs; ifs.open(fileInfo.name); ofs.open(tempDir);//这4行代码也可直接写成ifstream ifs(fileInfo.name),ofstream ofs(tempDir); while(!ifs.eof()) { ifs.getline(temp,200); string tempStr(temp); pos=tempStr.find(searchStr1,pos);//返回第一个查找到的位置 if(pos!=string::npos)//没找到时会返回 string::npos { tempStr.replace(pos,searchStr1.size(),replaceStr1); pos=0; pos=tempStr.find(searchStr2,pos); if(pos!=string::npos) { tempStr.replace(pos,searchStr2.size(),replaceStr2); } } pos=0; pos=tempStr.find(searchStr3,pos); if(pos!=string::npos) { tempStr.replace(pos,searchStr3.size(),replaceStr3); } pos=0; ofs<<tempStr<<endl; } ifs.close(); ofs.close(); } } _findclose(filehandle); return 0; }