C++读写文件代码自动生成器(python3完成)

来源:互联网 发布:淘宝店招收藏店铺代码 编辑:程序博客网 时间:2024/05/20 15:39

最近写c++读写文件的代码写的非常痛苦,于是想出来用python写个自动的,这也是这篇文章出来的原因,写程序到了一定时候,正好也在学习python这么语言,于是就选择它来完成这个工作了。目前只完成了二进制的版本。

下面我就简单说明下,这个生成器是如何运作的,首先我们知道在c++中有些关键词,我们只要将这些词列为关键词,这些词,大致分为两类,一类是直接可以写入写出的,另一类是不可以的,我们把它们分成两个列表存储。

然后设计自己的定义生成文件的格式,我暂时定义为下面的情况:



第一行标识是文件名字,第二行是模式,为了以后加入文本文件做准备,然后就是一些结构体,我们来生成读写这些结构体的代码:

import sys # Load the sys module (导入sys模块)  SimpleKeyWordInCplusplus = ['int', 'float', 'char', 'unsigned char', 'long', 'unsigned int', 'unsigned long', 'unsigned float', 'wchar_t', 'double', 'unsigned double']SpecialKeyWordInCplusplus = ['string', 'wstring', 'bool']def OutputStructToList(ss,FileNameAndFileMode, TheStructS, FunctionName):    lineNumbers = len(ss)    for i in range(0, len(ss)):        lines = ss[i]        if(-1!=lines.find("fileName",0,len(lines))):            FileNameSplit= lines.split()            FileNameAndFileMode.append(FileNameSplit[1])        if(-1!=lines.find("functionName",0,len(lines))):            tmpFunctionName = lines.split()            FunctionName.append(tmpFunctionName[1])        if(-1!=lines.find("modle",0,len(lines))):            if(-1==lines.find(";",0,len(lines))):                FileMode = lines.split()                FileNameAndFileMode.append(FileMode[1])                FileNameAndFileMode.append(FileMode[2])        if(-1!=lines.find("struct",0,len(lines))):            if((i+1)<lineNumbers):                nextLines = ss[i+1]                if(-1!=nextLines.find("{", 0, len(nextLines))):                    tmp = []                    StructName = lines.split()[1];                    TheStructS.append(StructName)                    for j in range(i+2,lineNumbers):                        theStructLine = ss[j]                                                 if(-1!=theStructLine.find('}',0,len(theStructLine))):                            break                        else:                            theStructLine=theStructLine.replace(';', ' ')                            theStructLine=theStructLine.replace('[', ' ')                            theStructLine=theStructLine.replace(']', ' ')                            StructItem = theStructLine.split();                            tmp.append(StructItem)                    TheStructS.append(tmp) def OutWriteFileFunction(FileNameAndFileMode, TheStructS, FunctionName,fp2):    structNumber = len(TheStructS)//2    for k in range(0, structNumber):        fp2.write('\n')        fp2.write('int\t'+'Write_'+TheStructS[2*k]+'('+'FILE'+'\t*fp,'+'const\t'+TheStructS[2*k])        fp2.write('\t&in'+TheStructS[2*k])        fp2.write(')\n')        fp2.write('{\n')        structItemsIndex = 2*k+1;        CurrentStructItemNumber =  len(TheStructS[structItemsIndex])        for i in range(0, CurrentStructItemNumber):            if(TheStructS[structItemsIndex][i][0] in SimpleKeyWordInCplusplus):                fp2.write('\tfwrite(&in'+TheStructS[2*k]+'.')                fp2.write(TheStructS[structItemsIndex][i][1]+',')                fp2.write('sizeof('+TheStructS[structItemsIndex][i][0]+')\t,')                if(3==len(TheStructS[structItemsIndex][i])):                    fp2.write(TheStructS[structItemsIndex][i][2]+'\t,fp);\n')                else:                    fp2.write('1'+'\t,fp);\n')            elif(SpecialKeyWordInCplusplus[0]==TheStructS[structItemsIndex][i][0]):                if(3==len(TheStructS[structItemsIndex][i])):                    stringNumbers = TheStructS[structItemsIndex][i][2];                                        fp2.write('\tint stringNumbers = '+stringNumbers+';\n')                    fp2.write('\tfwrite(&stringNumbers,\tsizeof(int)\t,1\t,fp)\n')                    fp2.write('\tfor(int i=0;i<'+stringNumbers+',i++)\n')                    fp2.write('\t{\n')                    fp2.write('\t\t')                    fp2.write('int theCurrentStringlength_v = in'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'[i].length();\n')                    fp2.write('\t\tfwrite(&theCurrentStringlength_v,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\t\tfwrite(&in'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'[i].c_str(),')                    fp2.write('\tsizeof(char)\t,theCurrentStringlength_v\t,fp);\n')                    fp2.write('\t}\n')                else:                    fp2.write('\tint theCurrentStringlength = in'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'.length();\n')                    fp2.write('\tfwrite(&theCurrentStringlength,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\tfwrite(&in'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'.c_str(),')                    fp2.write('\tsizeof(char)\t,theCurrentStringlength\t,fp);\n')            elif(SpecialKeyWordInCplusplus[1]==TheStructS[structItemsIndex][i][0]):                if(3==len(TheStructS[structItemsIndex][i])):                    wstringNumbers = TheStructS[structItemsIndex][i][2];                    fp2.write('\tint wstringNumbers = '+wstringNumbers+';\n')                    fp2.write('\tfwrite(&wstringNumbers,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\tfor(int i=0;i<'+wstringNumbers+',i++)\n')                    fp2.write('\t{\n')                    fp2.write('\t\t')                    fp2.write('int theCurrentWStringlength_v = in'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'[i].length();\n')                    fp2.write('\t\tfwrite(&theCurrentWStringlength_v,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\t\tfwrite(&'+TheStructS[structItemsIndex][i][1]+'[i].c_str(),')                    fp2.write('\tsizeof(wchar_t)\t,theCurrentWStringlength_v\t,fp);\n')                    fp2.write('\t}\n')                else:                    fp2.write('\tint theCurrentWStringlength = in'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'.length();\n')                    fp2.write('\tfwrite(&theCurrentWStringlength,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\tfwrite(&in'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'.c_str(),')                    fp2.write('\tsizeof(wchar_t)\t,theCurrentWStringlength\t,fp);\n')            elif(SpecialKeyWordInCplusplus[2]==TheStructS[structItemsIndex][i][0]):                if(3==len(TheStructS[structItemsIndex][i])):                    boolNumbers = TheStructS[structItemsIndex][i][2];                    fp2.write('\tint boolNumbers = '+boolNumbers+';\n')                    fp2.write('\tfwrite(&boolNumbers,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\tfor(int i=0;i<'+boolNumbers+',i++)\n')                    fp2.write('\t{\n')                    fp2.write('\t\t')                    fp2.write('char boolValue = in'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'[i]?1:-1;\n')                    fp2.write('\t\tfwrite(&boolValue,\tsizeof(char)\t,1\t,fp);\n')                    fp2.write('\t}\n')                else:                    fp2.write('\tchar boolValue = in'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'[i]?1:-1;\n')                    fp2.write('\tfwrite(&boolValue,\tsizeof(char)\t,1\t,fp);\n')            else:                fp2.write('\tWrite_'+TheStructS[structItemsIndex][i][0])                fp2.write('(fp,in'+TheStructS[2*k]+'.')                fp2.write(TheStructS[structItemsIndex][i][1]+');\n')                fp2.write('\n')        fp2.write('\treturn 0;\n')        fp2.write('}\n')def OutReadFileFunction(FileNameAndFileMode, TheStructS, FunctionName, fp2):    structNumber = len(TheStructS)//2    for k in range(0, structNumber):        fp2.write('\n')        fp2.write('int\t'+'Read_'+TheStructS[2*k]+'('+'FILE'+'\t*fp,'+'\t'+TheStructS[2*k])        fp2.write('\t&out'+TheStructS[2*k]+'')        fp2.write(')\n')        fp2.write('{\n')        structItemsIndex = 2*k+1;        CurrentStructItemNumber =  len(TheStructS[structItemsIndex])        for i in range(0, CurrentStructItemNumber):            if(TheStructS[structItemsIndex][i][0] in SimpleKeyWordInCplusplus):                fp2.write('\tfread(&'+'out'+TheStructS[2*k]+'.')                fp2.write(TheStructS[structItemsIndex][i][1]+',')                fp2.write('sizeof('+TheStructS[structItemsIndex][i][0]+')\t,')                if(3==len(TheStructS[structItemsIndex][i])):                    fp2.write(TheStructS[structItemsIndex][i][2]+'\t,fp);\n')                else:                    fp2.write('1'+'\t,fp)\n')            elif(SpecialKeyWordInCplusplus[0]==TheStructS[structItemsIndex][i][0]):                if(3==len(TheStructS[structItemsIndex][i])):                    fp2.write('\tint stringNumbers;\n')                    fp2.write('\tfread(&stringNumbers,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\tfor(int i=0;i<stringNumbers,i++)\n')                    fp2.write('\t{\n')                    fp2.write('\t\t')                    fp2.write('int theCurrentStringlength_v;\n')                    fp2.write('\t\tfread(&theCurrentStringlength_v,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\t\tchar* tmpCharBuffer_v = new char[theCurrentStringlength_v+1];\n')                    fp2.write('\t\tmemset(tmpCharBuffer_v, 0, theCurrentStringlength_v);\n')                    fp2.write('\t\tfread(tmpCharBuffer_v')                    fp2.write('\tsizeof(char)\t,theCurrentStringlength_v\t,fp);\n')                    fp2.write('\t\tout'+TheStructS[2*k]+'.'+TheStructS[structItemsIndex][i][1]+'[i]=')                    fp2.write('tmpCharBuffer_v;\n')                    fp2.write('\t\tdelete []tmpCharBuffer_v;\n')                    fp2.write('\t}\n')                else:                    fp2.write('\tint theCurrentStringlength = out'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'.length();\n')                    fp2.write('\tfread(&theCurrentStringlength,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\tchar* tmpCharBuffer = new char[theCurrentStringlength+1];\n')                    fp2.write('\tmemset(tmpCharBuffer, 0, theCurrentStringlength);\n')                    fp2.write('\tfread(tmpCharBuffer')                    fp2.write('\tsizeof(char)\t,theCurrentStringlength\t,fp);\n')                    fp2.write('\tout'+TheStructS[2*k]+'.'+TheStructS[structItemsIndex][i][1]+'=')                    fp2.write('tmpCharBuffer;\n')                    fp2.write('\tdelete []tmpCharBuffer;\n')            elif(SpecialKeyWordInCplusplus[1]==TheStructS[structItemsIndex][i][0]):                if(3==len(TheStructS[structItemsIndex][i])):                    fp2.write('\tint stringNumbers;\n')                    fp2.write('\tfread(&stringNumbers,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\tfor(int i=0;i<stringNumbers,i++)\n')                    fp2.write('\t{\n')                    fp2.write('\t\t')                    fp2.write('int theCurrentWStringlength_v;\n')                    fp2.write('\t\tfread(&theCurrentWStringlength_v,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\t\twchar_t* tmpwCharBuffer_v = new wchar_t[theCurrentWStringlength_v+1];\n')                    fp2.write('\t\tmemset(tmpwCharBuffer_v, 0, theCurrentWStringlength_v*sizeof(wchar_t));\n')                    fp2.write('\t\tfread(tmpwCharBuffer_v')                    fp2.write('\tsizeof(wchar_t)\t,theCurrentWStringlength_v\t,fp);\n')                    fp2.write('\t\tout'+TheStructS[2*k]+'.'+TheStructS[structItemsIndex][i][1]+'[i]=')                    fp2.write('tmpwCharBuffer_v;\n')                    fp2.write('\t\tdelete []tmpwCharBuffer_v;\n')                    fp2.write('\t}\n')                else:                    fp2.write('\tint theCurrentStringlength = out'+TheStructS[2*k]+'.')                    fp2.write(TheStructS[structItemsIndex][i][1]+'.length();\n')                    fp2.write('\tfread(&theCurrentStringlength,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\twchar_t* tmpwCharBuffer = new wchar_t[theCurrentStringlength+1];\n')                    fp2.write('\tmemset(tmpwCharBuffer, 0, theCurrentStringlength*sizeof(wchar_t));\n')                    fp2.write('\tfread(tmpwCharBuffer')                    fp2.write('\tsizeof(wchar_t)\t,theCurrentStringlength\t,fp);\n')                    fp2.write('\tout'+TheStructS[2*k]+'.'+TheStructS[structItemsIndex][i][1]+'=')                    fp2.write('tmpwCharBuffer;\n')                    fp2.write('\tdelete []tmpwCharBuffer;\n')            elif(SpecialKeyWordInCplusplus[2]==TheStructS[structItemsIndex][i][0]):                if(3==len(TheStructS[structItemsIndex][i])):                    fp2.write('\tint boolNumbers;\n')                    fp2.write('\tfread(&boolNumbers,\tsizeof(int)\t,1\t,fp);\n')                    fp2.write('\tfor(int i=0;i<boolNumbers,i++)\n')                    fp2.write('\t{\n')                    fp2.write('\t\t')                    fp2.write('char boolValue_v;\n')                    fp2.write('\t\tfread(&boolValue_v,\tsizeof(char)\t,1\t,fp);\n')                    fp2.write('\t\tout'+TheStructS[2*k]+'.'+TheStructS[structItemsIndex][i][1])                    fp2.write('[i]=((1==boolValue_v)?true:false);\n')                    fp2.write('\t}\n')                else:                    fp2.write('\tchar boolValue;\n')                    fp2.write('\tfread(&boolValue,\tsizeof(char)\t,1\t,fp);\n')                    fp2.write('\tout'+TheStructS[2*k]+'.'+TheStructS[structItemsIndex][i][1])                    fp2.write('=((1==boolValue)?true:false);\n')            else:                fp2.write('\tRead_'+TheStructS[structItemsIndex][i][0])                fp2.write('(fp,out'+TheStructS[2*k]+'.')                fp2.write(TheStructS[structItemsIndex][i][1]+');\n')                fp2.write('\n')        fp2.write('\treturn 0;\n')        fp2.write('}\n')        def outFinalWriteAndRead(FileNameAndFileMode,fp2):    fp2.write('\n')    fp2.write('int WriteFinal(string strPath,'+'YourParam param)\n')    fp2.write('{\n')    fp2.write('\tFILE *fp;\n')    fp2.write('\tfp= fopen(filename.c_str(),"'+FileNameAndFileMode[1]+'");\n')    fp2.write('\tif(NULL==fp)\n')    fp2.write('\t{\n')    fp2.write('\t\treturn -1;\n')    fp2.write('\t}\n')    fp2.write('\t//write Your Code Here!\n')    fp2.write('\n\n\n\n\n\n')    fp2.write('\tfclose(fp);\n')    fp2.write('\treturn 0;\n')    fp2.write('}\n')    fp2.write('\n')    fp2.write('int ReadFinal(string strPath,'+'YourParam param)\n')    fp2.write('{\n')    fp2.write('\tFILE *fp;\n')    fp2.write('\tfp= fopen(filename.c_str(),"'+FileNameAndFileMode[2]+'");\n')    fp2.write('\tif(NULL==fp)\n')    fp2.write('\t{\n')    fp2.write('\t\treturn -1;\n')    fp2.write('\t}\n')    fp2.write('\t//write Your Code Here!\n')    fp2.write('\n\n\n\n\n\n')    fp2.write('\tfclose(fp);\n')    fp2.write('\treturn 0;\n')    fp2.write('}\n')    def outFunction(src, dest):    fp = open(src, 'r+')    ss = fp.readlines();    fp.close()    print(len(ss))    FileNameAndFileMode =[]    FunctionName =[]    TheStructS = []    OutputStructToList(ss,FileNameAndFileMode , TheStructS, FunctionName)    fp2 = open(dest+FileNameAndFileMode[0]+'.cpp','w+')    fp2.write('#include'+'\t'+'<string>\n')    fp2.write('using namespace std;\n')    fp2.write('#include'+'\t'+'"'+FileNameAndFileMode[0]+'.h'+'"\n')    OutWriteFileFunction(FileNameAndFileMode, TheStructS, FunctionName, fp2)    OutReadFileFunction(FileNameAndFileMode, TheStructS, FunctionName, fp2)    outFinalWriteAndRead(FileNameAndFileMode,fp2)        fp2.flush()    fp2.close()    outFunction('N:/pythonProject/1.txt', 'N:/pythonProject/')


这是我的python代码,python的版本是3.3,这样我们就可以生成自己想要的读取文件的代码了,然后我们看下生成的c++代码:

#include<string>using namespace std;#include"fileName.h"intWrite_sss(FILE*fp,constsss&inputStruct){fwrite(&inputStruct.a,sizeof(int),15,fp);fwrite(&inputStruct.b,sizeof(float),13,fp);fwrite(&inputStruct.c,sizeof(char),1,fp);return 0;}intWrite_ff(FILE*fp,constff&inputStruct){int stringNumbers = 10;fwrite(&stringNumbers,sizeof(int),1,fp)for(int i=0;i<10,i++){int theCurrentStringlength_v = inputStruct.d[i].length();fwrite(&theCurrentStringlength_v,sizeof(int),1,fp);fwrite(&inputStruct.d[i].c_str(),sizeof(char),theCurrentStringlength_v,fp);}int theCurrentStringlength = inputStruct.f.length();fwrite(&theCurrentStringlength,sizeof(int),1,fp);fwrite(&inputStruct.f.c_str(),sizeof(char),theCurrentStringlength,fp);return 0;}intWrite_wff(FILE*fp,constwff&inputStruct){int wstringNumbers = 10;fwrite(&wstringNumbers,sizeof(int),1,fp);for(int i=0;i<10,i++){int theCurrentWStringlength_v = inputStruct.d[i].length();fwrite(&theCurrentWStringlength_v,sizeof(int),1,fp);fwrite(&d[i].c_str(),sizeof(wchar_t),theCurrentWStringlength_v,fp);}int theCurrentWStringlength = inputStruct.f.length();fwrite(&theCurrentWStringlength,sizeof(int),1,fp);fwrite(&inputStruct.f.c_str(),sizeof(wchar_t),theCurrentWStringlength,fp);return 0;}intWrite_booltest(FILE*fp,constbooltest&inputStruct){int boolNumbers = 10;fwrite(&boolNumbers,sizeof(int),1,fp);for(int i=0;i<10,i++){char boolValue = inputStruct.ffss[i]?1:-1;fwrite(&boolValue,sizeof(char),1,fp);}char boolValue = inputStruct.ssfd[i]?1:-1;fwrite(&boolValue,sizeof(char),1,fp);return 0;}intWrite_dd(FILE*fp,constdd&inputStruct){Write_sss(fp,inputStruct.aa);Write_ff(fp,inputStruct.bb);return 0;}intRead_sss(FILE*fp,sss&inputStruct){fread(&inputStruct.a,sizeof(int),15,fp);fread(&inputStruct.b,sizeof(float),13,fp);fread(&inputStruct.c,sizeof(char),1,fp)return 0;}intRead_ff(FILE*fp,ff&inputStruct){int stringNumbers;fread(&stringNumbers,sizeof(int),1,fp);for(int i=0;i<stringNumbers,i++){int theCurrentStringlength_v;fread(&theCurrentStringlength_v,sizeof(int),1,fp);char* tmpCharBuffer_v = new char[theCurrentStringlength_v+1];memset(tmpCharBuffer_v, 0, theCurrentStringlength_v);fread(tmpCharBuffer_vsizeof(char),theCurrentStringlength_v,fp);inputStruct.d[i]=tmpCharBuffer_v;delete []tmpCharBuffer_v;}int theCurrentStringlength = inputStruct.f.length();fread(&theCurrentStringlength,sizeof(int),1,fp);char* tmpCharBuffer = new char[theCurrentStringlength+1];memset(tmpCharBuffer, 0, theCurrentStringlength);fread(tmpCharBuffersizeof(char),theCurrentStringlength,fp);inputStruct.f=tmpCharBuffer;delete []tmpCharBuffer;return 0;}intRead_wff(FILE*fp,wff&inputStruct){int stringNumbers;fread(&stringNumbers,sizeof(int),1,fp);for(int i=0;i<stringNumbers,i++){int theCurrentWStringlength_v;fread(&theCurrentWStringlength_v,sizeof(int),1,fp);wchar_t* tmpwCharBuffer_v = new wchar_t[theCurrentWStringlength_v+1];memset(tmpwCharBuffer_v, 0, theCurrentWStringlength_v*sizeof(wchar_t));fread(tmpwCharBuffer_vsizeof(wchar_t),theCurrentWStringlength_v,fp);inputStruct.d[i]=tmpwCharBuffer_v;delete []tmpwCharBuffer_v;}int theCurrentStringlength = inputStruct.f.length();fread(&theCurrentStringlength,sizeof(int),1,fp);wchar_t* tmpwCharBuffer = new wchar_t[theCurrentStringlength+1];memset(tmpwCharBuffer, 0, theCurrentStringlength*sizeof(wchar_t));fread(tmpwCharBuffersizeof(wchar_t),theCurrentStringlength,fp);inputStruct.f=tmpwCharBuffer;delete []tmpwCharBuffer;return 0;}intRead_booltest(FILE*fp,booltest&inputStruct){int boolNumbers;fread(&boolNumbers,sizeof(int),1,fp);for(int i=0;i<boolNumbers,i++){char boolValue_v;fread(&boolValue_v,sizeof(char),1,fp);inputStruct.ffss[i]=((1==boolValue_v)?true:false);}char boolValue;fread(&boolValue,sizeof(char),1,fp);inputStruct.ssfd=((1==boolValue)?true:false);return 0;}intRead_dd(FILE*fp,dd&inputStruct){Read_sss(fp,inputStruct.aa);Read_ff(fp,inputStruct.bb);return 0;}int WriteFinal(string strPath,YourParam param){FILE *fp;fp= fopen(filename.c_str(),"wb");if(NULL==fp){return -1;}//write Your Code Here!fclose(fp);return 0;}int ReadFinal(string strPath,YourParam param){FILE *fp;fp= fopen(filename.c_str(),"rb");if(NULL==fp){return -1;}//write Your Code Here!fclose(fp);return 0;}

代码看起来还是有些凌乱,不过大家有兴趣可以重写写一下python代码,把他变得更加健壮!好了我又丢了一块板砖出来。希望大家喜欢!