📄 filesys20.c
字号:
{
return(ERR_IS_ERR_RCD);
}
}
if (rfP->FileType == NORMAL_TYPE)//不循环时范围
{
if ((Index<fhP->RecordBgNo) || (Index>fhP->RecordEndNo))
{
return(ERR_INDEX);
}
}
else//循环时范围
{
if (fhP->ValidRecordSum < rfP->MaxRecordSum)// 第一轮时
{
if ((Index<fhP->RecordBgNo) || (Index>fhP->RecordEndNo))
{
return(ERR_INDEX);
}
}
}
fhP->CurRecordNo=Index;//将Index写入当前读记录号
}
break;
case SET_FIRST://指针指向第一条记录
{
fhP->CurRecordNo=fhP->RecordBgNo;
}
break;
case SET_LAST://指针指向最后一条记录
{
fhP->CurRecordNo=fhP->RecordEndNo;
}
break;
case SET_NEXT://指针指向下一条记录
{
if (fhP->CurRecordNo == fhP->RecordEndNo)//已经是最后一条记录了
{
return(ERR_EOF);
}
else
{
if ((rfP->FileType==NORMAL_TYPE) || (rfP->FileType == FIFO_TYPE))
{
fhP->CurRecordNo=fhP->CurRecordNo+1;//当前读记录加一
}
else if (rfP->FileType == CYCLE_TYPE)
{
if ((rfP->ErrRecordMemType!=0) && (erP->Sum!=0))//有错误记录区时
{
unsigned char i;
for(i=0; i<erP->Sum; i++)
{
if (fhP->CurRecordNo != rfP->MaxRecordSum-1)
{
fhP->CurRecordNo=fhP->CurRecordNo+1;
}
else
{
fhP->CurRecordNo=0;
}
if (Is_ErrRecordNo(fhP->CurRecordNo, erP) == HH_OK)
{
break;
}
if (fhP->CurRecordNo == fhP->RecordEndNo)
{
return(ERR_EOF);
}
}
}
else //normal cycle
{
if (fhP->CurRecordNo != rfP->MaxRecordSum-1)
{
fhP->CurRecordNo=fhP->CurRecordNo+1;
}
else
{
fhP->CurRecordNo=0;
}
}
}
}
}
break;
case DELETE_RECORD://删除初始记录
if (rfP->FileType == FIFO_TYPE)
{
if (fhP->ValidRecordSum == 0)//无记录
{
return(ERR_LEN_SUM);
}
if(fhP->RecordBgNo == rfP->MaxRecordSum-1)
{
fhP->RecordBgNo=0;
}
else
{
fhP->RecordBgNo=fhP->RecordBgNo+1;
}
fhP->ValidRecordSum=fhP->ValidRecordSum-1;
}
break;
case WRITE_NEXT://写下一条记录
{
if (fhP->ValidRecordSum == 0)//首条记录添加操作
{
if ((rfP->FileType==NORMAL_TYPE) || (rfP->FileType == FIFO_TYPE))
{ //不循环和先进先出时记录总数是rfP->MaxRecordSum。
fhP->ValidRecordSum=1;
fhP->RecordBgNo=0;//记录开始序号0
fhP->RecordEndNo=0;
fhP->CurRecordNo=0;
}
else if (rfP->FileType == CYCLE_TYPE)
{ // 循环时第一轮记录总数是rfP->MaxRecordSum-1;之后才填充为rfP->MaxRecordSum
fhP->ValidRecordSum=1;
fhP->RecordBgNo=1;//记录开始序号1
fhP->RecordEndNo=1;
fhP->CurRecordNo=1;
}
}
else
{
if (fhP->ValidRecordSum == rfP->MaxRecordSum)//实际总数超过最大存储记录数
{
if ((rfP->FileType==NORMAL_TYPE) || (rfP->FileType == FIFO_TYPE))
{ //不循环和先进先出时,记录总数不能大于最大存储记录数
return(ERR_LEN_SUM);
}
else if (rfP->FileType == CYCLE_TYPE)
{ //在循环读写时
unsigned char i;
if ((rfP->ErrRecordMemType!=0) && (erP->Sum!=0))//有错误记录区时
{
for(i=0; i<erP->Sum; i++)
{
if (fhP->RecordBgNo != rfP->MaxRecordSum-1)
{
fhP->RecordBgNo=fhP->RecordBgNo+1;
}
else
{//在最后一条加记录记录起始序号归0
fhP->RecordBgNo=0;
}
if (Is_ErrRecordNo(fhP->RecordBgNo, erP) == HH_OK)
{
break;
}
}
}
else
{
if (fhP->RecordBgNo != rfP->MaxRecordSum-1)
{
fhP->RecordBgNo=fhP->RecordBgNo+1;
}
else
{//在最后一条加记录记录起始序号归0
fhP->RecordBgNo=0;
}
}
}
}
{
unsigned char i;
if ((rfP->ErrRecordMemType!=0) && (erP->Sum!=0))//有错误记录区时
{
for(i=0; i<erP->Sum; i++)
{
if (fhP->RecordEndNo == rfP->MaxRecordSum-1)//在最后一条加记录序号归0
{
fhP->RecordEndNo=0; //在循环读写和先进先出时有效
}
else
{
fhP->RecordEndNo=fhP->RecordEndNo+1;//记录终止序号加一
}
if (Is_ErrRecordNo(fhP->RecordEndNo, erP) == HH_OK)
{
break;
}
}
}
else
{
if (fhP->RecordEndNo == rfP->MaxRecordSum-1)//在最后一条加记录序号归0
{
fhP->RecordEndNo=0; //在循环读写和先进先出时有效
}
else
{
fhP->RecordEndNo=fhP->RecordEndNo+1;//记录终止序号加一
}
}
}
if (fhP->ValidRecordSum < rfP->MaxRecordSum)
{
fhP->ValidRecordSum=fhP->ValidRecordSum+1;//有效记录总数加一
}
fhP->CurRecordNo=fhP->RecordEndNo;
}
}
break;
default:
return(ERR_OPER_TYPE);//返回错误的操作类型
break;
}
#if (DEBUG_FILESYS==1)
PrintStr("\n Sum=");PrintByte(fhP->ValidRecordSum);
PrintStr("\n Bg=");PrintByte(fhP->RecordBgNo);
PrintStr("\n End=");PrintByte(fhP->RecordEndNo);
PrintStr("\n Cur=");PrintByte(fhP->CurRecordNo);
#endif
#if (DEBUG_FILEHEAD==1)
PrintStr("\n Oper_FileHead End!\n ");
#endif
return(HH_OK);
}
/*
****************************************************************************************
函数名称:Read_Record
入口参数:*rfP:记录文件指针,*fhP:文件头指针,*Ptr:指向读取的记录文件数据的指针
返回 值:
功能描述:读取记录文件(内部使用)
算法描述:
建立时间:2003/12/24
作 者:
当前版本:V2.0
-----------------------------------
修改时间:2004/11/26
V2.0版修改说明:
增加InsideRead()/InsideWrite()作为中间读写层,使读写结构融合为一种,使程序容易维护,
在InsideWrite()中对写入的结果读出后比较,确保写入数据正确
****************************************************************************************
*/
unsigned char Read_Record(_RecordFile *rfP,_FileHead *fhP,unsigned char *Ptr)
{
unsigned char ErrType;
xdata unsigned char tmpData[MAX_RECORD_LEN+1];
_BinaryFile nowFile;
#if (DEBUG_RCDFILE==1)
PrintStr("\n Rd_Rcd Begin!\n ");
#endif
nowFile.BakFlag = rfP->BakFlag;
nowFile.MemType = rfP->BodyMemType;
nowFile.FirstAddr = rfP->BodyFirstAddr+(unsigned long)(fhP->CurRecordNo)*(rfP->MaxRecordLen+1);
nowFile.MaxLen = rfP->MaxRecordLen;
ErrType = InsideRead(&nowFile,tmpData,XOR_CHECK);
memcpy(Ptr, tmpData, rfP->MaxRecordLen);
#if (DEBUG_RCDFILE==1)
PrintStr("\n Rd_Rcd End!\n ");
#endif
return(ErrType);
}
/*
****************************************************************************************
函数名称:Write_Record
入口参数:*rfP:记录文件指针,*fhP:文件头指针,*Ptr:指向要写入的记录文件数据的指针
返回 值:
功能描述:写记录文件(内部使用)
算法描述:
建立时间:2003/12/24
作 者:
当前版本:V2.0
-----------------------------------
修改时间:2004/11/26
V2.0版修改说明:
增加InsideRead()/InsideWrite()作为中间读写层,使读写结构融合为一种,使程序容易维护,
在InsideWrite()中对写入的结果读出后比较,确保写入数据正确
****************************************************************************************
*/
unsigned char Write_Record(_RecordFile *rfP,_FileHead *fhP,unsigned char *Ptr)
{
unsigned char ErrType;
xdata unsigned char tmpData[MAX_RECORD_LEN+1];
_BinaryFile nowFile;
#if (DEBUG_RCDFILE==1)
PrintStr("\n Wr_Rcd Begin!\n ");
#endif
nowFile.BakFlag = rfP->BakFlag;
nowFile.MemType = rfP->BodyMemType;
nowFile.FirstAddr = rfP->BodyFirstAddr+(unsigned long)(fhP->CurRecordNo)*(rfP->MaxRecordLen+1);
nowFile.MaxLen = rfP->MaxRecordLen;
memcpy(tmpData, Ptr, rfP->MaxRecordLen);
ErrType = InsideWrite(&nowFile,tmpData,XOR_CHECK);
#if (DEBUG_RCDFILE==1)
PrintStr("\n Wr_Rcd End!\n ");
#endif
return(ErrType);
}
/*
****************************************************************************************
函数名称:Oper_Record
入口参数:FileID:文件标识符,Index:记录文件序号,
*Ptr:指向记录文件数据,OperType:操作类型
返回 值:
功能描述:操作记录文件(内部使用)
算法描述:
建立时间:2003/12/24
作 者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char Oper_Record(unsigned char FileID,unsigned int Index,unsigned char *Ptr,unsigned char OperType)
{
unsigned char ErrType;
unsigned char ErrType2;
xdata unsigned char tmpHeadData[FILE_HEAD_MAX_LEN+1];
xdata unsigned char tmpErrData[ERR_RECORD_MAX_LEN+1];
_RecordFile *rfP;
_FileHead *fhP;
_ErrRecord *erP;
if ((OperType==CHECK_RECORD)||(OperType==COUNT_RECORD)||(OperType==START_INIT))
{
return(ERR_OPER_TYPE);
}
if (FileID > RECORD_FILE_SUM-1)return(ERR_ID);
rfP = &RecordFile[FileID];
ErrType=Read_FileHead(rfP,tmpHeadData); //读文件头
if (ErrType != HH_OK)
{
return(ErrType);
}
fhP=(_FileHead *)tmpHeadData;
if (rfP->ErrRecordMemType != 0) //有错误记录的才读
{
ErrType=Read_ErrRecord(rfP,tmpErrData); //读错误记录文件区
if (ErrType != HH_OK)
{
return(ErrType);
}
erP=(_ErrRecord *)tmpErrData;
}
else
{
erP=NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -