最近要写一个删除文件中一行数据,因为是在mtk下写,好像是没有找到读取一行数据的函数。就自己写了一个。
//返回一行数据的长度 //buffer的返回行数据中没有带\r\n int fs_readline(int f,char *buffer) { int pos = 0; UINT nResult = 0; char temp[2]={0}; while(1) { FILE_READ(f,temp,1,&nResult); if(nResult==1) { pos++; if(temp[0]=='\n') { break; } else if(temp[0]=='\r') { continue; }else { buffer[pos]=temp[0]; } }else { break; } } return pos; }
接下来,是要实现删除一行文件的函数,代码是用在其它特殊场合,所以变量名会比较怪,如果需要使用请自行修改。
基本原理是,从A读取一行数据,然后比较,如果不相等就写到B文件,如果找到,就跳过,后关闭文件,再重命名。
//pSerial要删除的一行数据内容 //返回行数 int Del_OneLine(char *pSerial) { int f,f_tmp; char temp[50]={0}; int pos = 0; int count = 0; f = FILE_OPEN(FAIL_RECORD, FS_READ_WRITE); f_tmp = FILE_OPEN(TMP_RECORD, FS_READ_WRITE); if (f ==FS_FILE_NOT_FOUND) { f = FILE_OPEN(FAIL_RECORD, FS_CREATE | FS_READ_WRITE); if(f < FS_NO_ERROR) return FALSE; } if (f_tmp ==FS_FILE_NOT_FOUND) { f_tmp = FILE_OPEN(TMP_RECORD, FS_CREATE | FS_READ_WRITE); if(f_tmp < FS_NO_ERROR) return FALSE; } do{ char str[50]={0}; UINT ilen = 0; pos = fs_readline(f,str); if(pos>0) { if(strcmp(pSerial,str)==0) { break; } sprintf(temp,"%s\r\n",str); if(FILE_WRITE(f_tmp, &temp,pos, (UINT *)&ilen) != FS_NO_ERROR) { FILE_CLOSE(f_tmp); return FALSE; } } }while(pos>0); while( FILE_READ(f,temp,sizeof(temp),&nResult)==FS_NO_ERROR){ if(FILE_WRITE(f_tmp, &temp, nResult, (UINT *)&ilen) != FS_NO_ERROR) { FILE_CLOSE(f_tmp); return FALSE; } } FILE_CLOSE(f); FILE_CLOSE(f_tmp); FS_Delete(FAIL_RECORD); FS_Rename( TMP_RECORD,FAIL_RECORD); return count; }