📄 file.c
字号:
* CLEARBUFFER
*
* 作者:胡仲华
*
* 时间:2007年7月4日
*
* 描述:晴空存放当前需要读取的一行记录的缓冲区
*
* 参数:无
*
* 返回值:无
***********************************************************************************************************************
*/
void clearBuffer(void)
{
int i;
for(i=0;i<100;i++){
buffer[i] = '\0'; //将缓冲区所有字符清0
}
}
/*
**********************************************************************************************************************
* GETTOKEN
*
* 作者:胡仲华
*
* 时间:2007年7月4日
*
* 描述:读取某一行记录的具体属性值(name,telnum,plmnum,mail)
*
* 参数:index:读取开始索引
*
* 返回值:某一具体记录及其相应的属性(name,telnum,plmnum,mail)
***********************************************************************************************************************
*/
RECLIST GetToken(){
RECLIST rcd;
int item =0; //用户记录中属性的编号,0为name,1为telnum,2为plmnum,3为mail
int index =0;
int tokenIndex=0;
//当前读取的属性中字符索引
while(buffer[index]!='#'){ //如果当前读取到的字符不是回车,那么继续读取
switch(item){
case 0: //如果当前读取的是name
while(buffer[index]!=','&&buffer[index]!='\0'){ //如果读取到的不是逗号或者‘\0',
rcd.name[tokenIndex]=buffer[index]; //那么就将独到的字符一个一个加到name中
index++; //缓冲区索引加一
tokenIndex++; //属性中字符索引加一
}
rcd.name[tokenIndex]='\0';
index++; //如果读取到了逗号或者'\r',那么证明一个属性读取完成
tokenIndex=0; //将tokenIndex置0,以便下一个属性读取
item++; //置item为下一个属性的编号
break;
case 1:
while(buffer[index]!=','&&buffer[index]!='\0'){ //如果读取到的不是逗号或者‘\0',
rcd.telnum[tokenIndex]=buffer[index]; //那么就将独到的字符一个一个加到telnum中
index++; //缓冲区索引加一
tokenIndex++; //属性中字符索引加一
}
rcd.telnum[tokenIndex]='\0';
index++; //如果读取到了逗号或者'\r',那么证明一个属性读取完成
tokenIndex=0; //将tokenIndex置0,以便下一个属性读取
item++; //置item为下一个属性的编号
break;
case 2:
while(buffer[index]!=','&&buffer[index]!='\0'){ //如果读取到的不是逗号或者‘\0',
rcd.plmnum[tokenIndex]=buffer[index]; //那么就将独到的字符一个一个加到plmnum中
index++; //缓冲区索引加一
tokenIndex++; //属性中字符索引加一
}
rcd.plmnum[tokenIndex]='\0';
index++; //如果读取到了逗号或者'\r',那么证明一个属性读取完成
tokenIndex=0; //将tokenIndex置0,以便下一个属性读取
item++; //置item为下一个属性的编号
break;
case 3:
while(buffer[index]!=','&&buffer[index]!='\0'){ //如果读取到的不是逗号或者‘\0',
rcd.mail[tokenIndex]=buffer[index]; //那么就将独到的字符一个一个加到mail中
index++; //缓冲区索引加一
tokenIndex++; //属性中字符索引加一
}
rcd.mail[tokenIndex]='\0';
index++; //如果读取到了逗号或者'\r',那么证明一个属性读取完成
tokenIndex=0; //将tokenIndex置0,以便下一个属性读取
return rcd;
break;
default:
break;
}
}
return rcd; //返回记录结构体
}
/*
******************************************************************************************************
* GETMAXLINE
* 作者:胡仲华
*
* 时间:2007年7月6日
*
* 描述:获得文件有效内容的行数,用来控制记录上下页查找不越界
*
* 参数:类型:unsigned char[],buffer:需要读取的文件内容的数据
*
* 返回值:
类型:整型
描述:文件有效内容的行数
*****************************************************************************************************
*/
int GetMaxLine(unsigned char buffer[])
{
int index =0,maxLine=0;
while(buffer[index]!='#'){ //如果读取的是有效内容
if(buffer[index]=='\n'){ //如果遇到回车换行
maxLine++; //行数加一
}
index++;
}
return maxLine; //返回行数
}
/*
******************************************************************************************************
* DELETELINE
* 作者:胡仲华
*
* 时间:2007年7月6日
*
* 描述:删除文件中特定的某一行
*
* 参数:file:需要删除行的文件指针,filename:需要做删除操作的文件的名称;line:需要删除的某一行的行号
*
* 返回值:0或1,0表示删除失败,1表示删除成功
*****************************************************************************************************
*/
int DeleteLine(FILECNT * file,char filename[],int line){
U8 * begin; //指示文件数据缓冲区的数据开头
U8 * current; //当前需要删除的行的字符在缓冲中的当前位置指针
U8 * next; //当前需要删除的行的下一行的字符位置指针
U8 * end; //有效数据的结束位置指针
int j=0; //控制变量
int indexBegin =0; //文件数据的字符开始索引
int indexEnd =0; //文件有效数据的字符结束索引
int indexNext=0; //要删除的行的下一行的开始索引
int maxLine=0;
int lineLength=0; //文件有效数据的行数
begin = (*file).Buffer; //begin指向文件数据头
maxLine =GetMaxLine(begin); //获得文件记录总行数
Uart_Printf("\nmaxLine=%d",maxLine);
indexBegin = GetLine(begin,line); //获得要删除的行的开始字符索引
indexNext = GetLine(begin,line+1);
Uart_Printf("indexNext = %d\n",indexNext); //获得下一行的开始字符索引
indexEnd = GetLine(begin,maxLine);
Uart_Printf("indexEnd = %d\n",indexEnd); //获得有效数据的结束字符索引
//current = begin + indexBegin;
lineLength = indexNext-indexBegin; //获得要删除的一行的长度
//Uart_Printf("maxLine = %d\n",indexEnd);
next = begin + indexNext; //将next指向下一行的开始字符
end = begin + indexEnd; //将end指向结束字符
current = begin + indexBegin; //将current指向当前要删除的行开头
if(indexNext == indexEnd&&maxLine ==1) //如果文件中只有一行记录,并且要删除该行
{
if(indexBegin%528>=512){ //如果需要填补的位置到了数据的非有效区
begin=begin+16; //直接跳到下一个页的有效区开头继续操作
}
for(j=0;j<10;j++){
*begin = '#'; //直接将一串#填补到文件中
begin++;
}
} //如果文件不止一条记录
else{
while(current!=end&&next!=end&&indexNext<=indexEnd){ //如果没有读取到文件有效数据的结尾
while(indexBegin%528<512&&indexNext%528<512){ //如果读取到的位置是文件缓冲区中数据的有效位置,
//注:每个页面只有512个字节存放有效数据
*current = *next; //将要上出的行的后面行的数据一一向前移动,填补要删除的这一行
indexBegin++; //被填补的位置索引加一
indexNext++; //填补的位置的索引加一
current++; //指针后移
next++; //指针后移
}
if(indexBegin%528>=512){ //如果需要填补的位置到了数据的非有效区
indexBegin=indexBegin+16; //直接跳到下一个页的有效区开头继续操作
current = begin + indexBegin;
}
if(indexNext%528>=512)
{
indexNext=indexNext+16; //如果用来填补的数据读取的位置到了数据的非有效区
next = begin + indexNext; //直接跳到下一个页的有效区开头继续操作
}
j++;
}
if(indexBegin%528>=512){ //如果需要填补的位置到了数据的非有效区
indexBegin=indexBegin+16; //直接跳到下一个页的有效区开头继续操作
current = begin + indexBegin;
}
for(j=0;j<10;j++){ //文件以一串#号结束
*current = '#';
current++;
}
}
WriteFile(filename,(*file).Buffer,indexEnd-lineLength+10); //将新的删除了一行的文件数据写回文件
//WriteFile(filename,(U8 *)&DATABUFF,(*file).filesize);
return 1; //删除成功
}
/*
******************************************************************************************************
* INSERTALINE
* 作者:胡仲华
*
* 时间:2007年7月6日
*
* 描述:插入一行记录到文件filenames中
*
* 参数:file:指向需要插入数据的文件指针,filename:需要做插入操作的文件的名称;rcd:需要插入的数据
*
* 返回值:0或1,0表示插入失败,1表示插入成功
*****************************************************************************************************
*/
int InsertALine(FILECNT * file,char filename[],RECLIST rcd)
{
int indexEnd =0; //文件尾索引
int i; //控制变量
int length=0; //文件长度
U8 * current; //当前读取位置指针
U8 * begin=(*file).Buffer; //文件开头指针
indexEnd = GetLine(begin,GetMaxLine(begin)); //获取文件尾索引
length = indexEnd; //未插入数据前,文件长度与索引尾一致
current = begin +indexEnd; //将当前指针指向需要插入数据的位置,即原文件尾
if(indexEnd%528<512){ //如果当前插入的索引的位置在有效数据区内
for(i=0;i<20;i++) //插入name
{
if(indexEnd%528>=512){ //如果读取到了非有效区,
indexEnd =indexEnd +16; //那么直接跳到下一个页的有效区开始处,继续操作
current = begin + indexEnd;
}
if(rcd.name[i]!=0x0){ //如果name没有读完
*current = rcd.name[i]; //将name的字符一一加如到文件的数据缓冲区
current++; //指针向后移
indexEnd++; //文件结尾索引加一
}
else{
*current = ','; //如果name读取完成,在name后添加一个逗号
current++; //指针向后移
indexEnd++; //文件尾索引加一
break; //跳出读取name的循环
}
}
length+=i+1; //文件长度加上name的长度,表示当前文件长度
for(i=0;i<16;i++)
{
if(indexEnd%528>=512){ //如果读取到了非有效区,
indexEnd =indexEnd +16; //那么直接跳到下一个页的有效区开始处,继续操作
current = begin + indexEnd;
}
if(rcd.telnum[i]!=0x0){ //如果telnum没有读完
*current = rcd.telnum[i]; //将telnum的字符一一加如到文件的数据缓冲区
current++; //指针向后移
indexEnd++; //文件结尾索引加一
}
else{
*current = ','; //如果telnum读取完成,在telnum后添加一个逗号
current++; //指针向后移
indexEnd++; //文件尾索引加一
break; //跳出读取telnum的循环
}
}
length+=i+1; //文件长度加上telnum的长度,表示当前文件长度
for(i=0;i<16;i++)
{
if(indexEnd%528>=512){ //如果读取到了非有效区,
indexEnd =indexEnd +16; //那么直接跳到下一个页的有效区开始处,继续操作
current = begin + indexEnd;
}
if(rcd.plmnum[i]!=0x0){ //如果plmnum没有读完
*current = rcd.plmnum[i]; //将plmnum的字符一一加如到文件的数据缓冲区
current++; //指针向后移
indexEnd++; //文件结尾索引加一
}
else{
*current = ','; //如果plmnum读取完成,在plmnum后添加一个逗号
current++; //指针向后移
indexEnd++; //文件尾索引加一
break; //跳出读取plmnum的循环
}
}
length+=i+1; //文件长度加上plmnum的长度,表示当前文件长度
for(i=0;i<25;i++)
{
if(indexEnd%528>=512){ //如果读取到了非有效区,
indexEnd =indexEnd +16; //那么直接跳到下一个页的有效区开始处,继续操作
current = begin + indexEnd;
}
if(rcd.mail[i]!=0x0){ //如果mail没有读完
*current = rcd.mail[i]; //将mail的字符一一加如到文件的数据缓冲区
current++; //指针向后移
indexEnd++; //文件结尾索引加一
}
else{
break; //读取完成,跳出循环
}
}
length+=i+1; //文件长度加上mail的长度,表示当前文件长度
}
if(indexEnd%528>=512){
indexEnd =indexEnd +16;
current = begin + indexEnd;
}
*current = '\r'; //添加换行
current++;
*current = '\n';
current++;
indexEnd++;
for(i=0;i<10;i++) //添加“#”表示文件尾
{
*current = '#';
current++;
indexEnd++;
}
WriteFile(filename,(*file).Buffer,length+11); //将添加了一行数据的文件数据写回文件
return 1;
}
//end the file.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -