www.pudn.com > onlyC.rar > fileOper.c
#include "fileOper.h" /* _______________________________________________ |FUNCTION :FileAddString |OPERATIN :文件末尾添加字符串 |RETURN :|PARAMETER : | filename :文件名 | addstring :要添加的字符串 _______________________________________________ */ void FileAddString(char *filename,char *addstring) { FILE *fp; if((fp=fopen(filename,"rb+"))==NULL)return; fseek(fp,0,SEEK_END); fprintf(fp,"%s",addstring); fclose(fp); } /* _______________________________________________ |FUNCTIONNAME :FileReplace |OPERATION :在文件中替换一个字符串,只替换一次 |PARAMETER : | filename :文件名 | str_find :查找的字符串 | str_rpelace :要替换的字符串 | int_buffer :缓冲大小 | return :是否替换成功(0,false,1,true) |_________________________________________________ */ int FileReplace(char *filename,char *str_find,char *str_replace,int int_buffer) { long long_StringSeek,readSeek,writeSeek,fileSize; int int_Data; int findLen,replaceLen,int_SubStr; FILE *fp1; long_StringSeek=FileFindString(filename,str_find,0,int_buffer); if(long_StringSeek==-1)return 0; fp1=fopen(filename,"rb+"); findLen=strlen(str_find); replaceLen=strlen(str_replace); int_SubStr=findLen-replaceLen; fileSize=GetFileLength(filename); if(int_SubStr==0) { }else if(int_SubStr<0) { ChangeFileSize(filename,fileSize-int_SubStr);/*变大*/ fseek(fp1,-1L,SEEK_END); writeSeek=ftell(fp1); readSeek=writeSeek+int_SubStr; for(;readSeek>=long_StringSeek;readSeek--,writeSeek--) { fseek(fp1,readSeek,SEEK_SET); int_Data=fgetc(fp1); fseek(fp1,writeSeek,SEEK_SET); fputc(int_Data,fp1); } }else if(int_SubStr>0)/*文件变小*/ { writeSeek=long_StringSeek+replaceLen; readSeek=writeSeek+int_SubStr; for(;readSeek |PARAMATER : | filename :文件名 | size :要设置的大小 | —————————————————————————— */ void ChangeFileSize(char *filename,long size) { int fh; if( (fh = _open( filename, _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE )) != -1 ) { _chsize(fh,size); } _close(fh); return; } //得到文件大小(byte) long GetFileLength(char *filename) { int fh; long file_size; if( (fh = _open( filename, _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE )) != -1 ) { file_size=_filelength( fh ) ; }else { file_size=-1; } _close(fh); return file_size; } /* _______________________________________________ | |FUNCTIONNAME :Buffer_ScanString |OPERATION :在Buffer 中的指定位置内查找的字符串(专用于FindFileString的核心代码) |RETRUN :返回在找到的位置与point的距离,-1则表示找不到. |PARAMETER : | buffer :缓冲区 | str_find :查找的字符串 | point :在Buffer 中的起始位置 | point_space :比较次数,比较空间, | int_buffer :缓冲区大小 | _______________________________________________ */ int Buffer_ScanString(char *buffer,char *str_find,int point,int point_space,int int_BufferLong) { int int_i; int cmp_point,cmp_next; int int_buffer,int_findlen; cmp_point=point % int_BufferLong; int_buffer=point_space; int_findlen=strlen(str_find); for(cmp_next=cmp_point+int_buffer;cmp_point =int_findlen)break;//如果两字符串相等就走人. } if(cmp_point int_buffer)int_buffer=int_findlen;/*字符串长度必定小于单个区域大小*/ int_BufferLong=int_buffer*2; /*计算区域的起始位置*/ cmp_ad1=0; cmp_ad2=int_buffer; /* Open a file 得到文件大小*/ file_size=GetFileLength(filename); if(file_size==-1)return -1; /*制配缓冲大小*/ buffer=(char *)malloc(sizeof(char)*int_buffer*2); fp=fopen(filename,"rb"); fseek(fp,lng_SeekStart,0); file_size-=lng_SeekStart; lng_Loop_End=file_size/int_buffer;/*计算文件有几个Buffer,(区域)*/ cmp_point=cmp_ad1;/*是0;*/ /*如果文件大小连一个区都填不满*/ if(lng_Loop_End<1) { /*lost something*/ fread(buffer,file_size,1,fp); cmp_ret=Buffer_ScanString(buffer,str_find,0,file_size,int_BufferLong); if(cmp_ret!=-1) { lng_FindSeek=cmp_ret; }else { lng_FindSeek=-1; } goto FindSeekQuit; } /*以下是文件起码超过一个区域时的情况*/ fread(buffer+cmp_ad1,int_buffer,1,fp);/*初始化(先把第一个缓冲区填满)*/ for(lng_Loop_Go=1;lng_Loop_Go 0)fread(buffer+cmp_ret,int_i,1,fp); /*函数中心,窗口比较两字符串是否一样,其实是从重复上面的比较.*/ cmp_ret=(int_buffer+int_i)-(int_findlen-1); cmp_ret=Buffer_ScanString(buffer,str_find,cmp_point,cmp_ret,int_BufferLong); if(cmp_ret!=-1)/*找到*/ { lng_FindSeek=(lng_Loop_End-1)*int_buffer+cmp_ret; }else { lng_FindSeek=-1; } /*退出函数,释放资源*/ FindSeekQuit: free(buffer); fclose(fp); if(lng_FindSeek>=0)lng_FindSeek+=lng_SeekStart; return lng_FindSeek; }