⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 一个基于单片机的小型操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
*                       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 + -