📄 dml.h
字号:
{
if(strcmp(WA[0]->FldInfor_P[j-1].FldClass,"char")==0)
{
fread(ch1,1,WA[0]->FldInfor_P[j-1].FldLen,WA[0]->DbFi_P);
fwrite(ch1,1,WA[0]->FldInfor_P[j-1].FldLen,fp);
}
else if(strcmp(WA[0]->FldInfor_P[j-1].FldClass,"float")==0)
{
fread(&f,sizeof(float),1,WA[0]->DbFi_P);
fwrite(&f,sizeof(float),1,fp);
}
else
{
fread(&k,sizeof(int),1,WA[0]->DbFi_P);
fwrite(&k,sizeof(int),1,fp);
}
}
}
break ;
default :
break ;
}
}
fseek(fp,0,SEEK_END);
len=ftell(fp);
i=(len-HeadSize)/(WA[0]->RecLen); /* 根据文件长及一二级原数据长计算删除后所剩的记录数 */
printf("The Remains Number is %d\n",i);
fseek(fp,4L,SEEK_SET);
fwrite(&i,2,1,fp); /* 将新的记录总数写入文件 */
if(remove(Tem)!=0)/* 删除旧文件 */
{
perror("remove");
}
rename("TEP.TXT",Tem); /* 将临时新文件名更新为旧文件名 */
fclose(fp);
fclose( WA[0]->DbFi_P);
WA[0]->DbFi_P=NULL; /* 关关闭数据文件*/
WA[0]=NULL;
}
/* ------------------------------------------------------------------------------------------------ */
Condition_Type Di_Exp(char*Token)
{
char ch3[20];
int i,k,m,n ;
Condition_Type Condition1 ;
for(i=0;i<strlen(Token);i++)
{
if(Token[i]=='=')
break ;
}
k=i ;
strncpy(Condition1.WhichFld,Token,k);
Condition1.WhichFld[k+1]='\0' ;
Condition1.WhichFld[strlen(Condition1.WhichFld)-1]='\0' ;
strncpy(ch3,&Token[k],strlen(Token)-k+1);
n=strlen(ch3);
if(strchr(ch3,'+')||strchr(ch3,'-')||strchr(ch3,'*')||strchr(ch3,'/'))
{
strncpy(ch3,&ch3[k+1],strlen(ch3)-k+1);
m=strlen(ch3);
strcpy(Condition1.OPTR,ch3);
Condition1.OPTR[1]='\0' ;
strncpy(ch3,&ch3[1],strlen(ch3)-1);
ch3[m-1]='\0' ;
strcpy(Condition1.Value,ch3);
}
else
{
strcpy(Condition1.OPTR,"");
strncpy(Condition1.Value,&ch3[1],strlen(ch3)-1);
Condition1.Value[n-1]='\0' ;
}
return Condition1 ;
}
/* ---------------------------------------------------------------------------------------------------- */
Do_Update(CmdRec_Type CmdRec,char*Token)
{
FILE*fp ;
Condition_Type Condition,Condition1 ;
int k,k1,j,i,i1,m,n,w,handle,len1=0,len2=0,f2,HeadSize,Tem[20];
float f,f1 ;
char ch[20],ch1[20],cha[6],cha1[6],Range[150];
clrscr();
textbackground(BLUE);
textcolor(YELLOW);
strcpy(Tem,CmdRec.UserStr);
ChangeExt(Tem,".TXT");
if((WA[0]->DbFi_P=fopen(Tem,"r+b"))==NULL) /* 打开数据文件 */
{
printf("File open error!\n");
return ;
}
fseek(WA[0]->DbFi_P,0,SEEK_SET);
fread(WA[0],2,3,WA[0]->DbFi_P);
fread(&WA[0]->FldInfor_P[0],(WA[0]->FldNum)*sizeof(struct FldInforStruct),1,WA[0]->DbFi_P);
if((fp=fopen("TEP.TXT","w+b"))==NULL) /* 打开新文件,供中转数据用 */
{
printf("File open error!\n");
return ;
}
fwrite(WA[0],(6+(WA[0]->FldNum)*sizeof(struct FldInforStruct)),1,fp);
HeadSize=6+(WA[0]->FldNum)*sizeof(struct FldInforStruct);
CutBlank_Head_Tail(Token);
strncpy(Token,&Token[5],strlen(Token)-4);
CutBlank_Head_Tail(Token);
for(i=0;i<strlen(Token);i++)
{
if(Token[i]=='='||Token[i]=='<'||Token[i]=='>')
break ;
}
k=i ;
strncpy(Condition.WhichFld,Token,k); Condition.WhichFld[k] = '\0';
if(Token[k+1]=='>'||Token[k+1]=='<')
{
strcpy(Condition.OPTR,"<>");
strncpy(Condition.Value,&Token[k+2],strlen(Token)-k-1);
}
else
{
Condition.OPTR[0]=Token[k];
strncpy(Condition.Value,&Token[k+1],strlen(Token)-k);
}
printf("The modified records are as follows:\n");
for(i=0;i<WA[0]->FldNum;i++)
{
printf("%-10s",WA[0]->FldInfor_P[i].FldName);
}
printf("\n");
for(i=0;i<WA[0]->FldNum;i++)
{
if(strcmp(WA[0]->FldInfor_P[i].FldName,Condition.WhichFld)==0)
{
strcpy(cha,WA[0]->FldInfor_P[i].FldClass);
break ;
}
}
n=++i ;
for(i=0;i<n-1;i++)
{
if(!strcmp("float",WA[0]->FldInfor_P[i].FldClass))
len1+=sizeof(float);
else if(!strcmp("int",WA[0]->FldInfor_P[i].FldClass))
len1+=sizeof(int);
else if(!strcmp("char",WA[0]->FldInfor_P[i].FldClass))
len1+=(WA[0]->FldInfor_P[i].FldLen);
}
w=i ;
Condition1=Di_Exp(CmdRec.Exp);
for(i=0;i<WA[0]->FldNum;i++)
{
if(strcmp(WA[0]->FldInfor_P[i].FldName,Condition1.WhichFld)==0)
{
strcpy(cha1,WA[0]->FldInfor_P[i].FldClass);
break ;
}
}
n=++i ;
for(i=0;i<n-1;i++)
{
if(!strcmp("float",WA[0]->FldInfor_P[i].FldClass))
len2+=sizeof(float);
else if(!strcmp("int",WA[0]->FldInfor_P[i].FldClass))
len2+=sizeof(int);
else if(!strcmp("char",WA[0]->FldInfor_P[i].FldClass))
len2+=(WA[0]->FldInfor_P[i].FldLen);
}
for(i=1;i<=WA[0]->FldNum;i++)
{
strcat(Range,WA[0]->FldInfor_P[i-1].FldName);
strcat(Range,",");
}
for(m=1;m<=WA[0]->TotalRec;m++)
{
fseek(WA[0]->DbFi_P,HeadSize+len1+(m-1)*WA[0]->RecLen,SEEK_SET);
if(strcmp(cha,"char")==0)
{
fread(ch,1,WA[0]->FldInfor_P[w].FldLen,WA[0]->DbFi_P);
}
else if(strcmp(cha,"float")==0)
{
fread(&f,sizeof(float),1,WA[0]->DbFi_P);
}
else if(strcmp(cha,"int")==0)
{
fread(&k,sizeof(int),1,WA[0]->DbFi_P);
}
switch(strlen(cha)) /* 根据删除条件字段的类型,分流处理 */
{
case 3 : /* 满足删除条件显示在屏幕上 */
if(strcmp(Compare_I(k,Condition),Condition.OPTR)==0)
{
fseek(WA[0]->DbFi_P,HeadSize+(m-1)*WA[0]->RecLen,SEEK_SET);
for(j=1;j<=WA[0]->FldNum;j++)
{
if(strcmp(WA[0]->FldInfor_P[j-1].FldName,Condition1.WhichFld)==0)
{
if(strcmp(WA[0]->FldInfor_P[j-1].FldClass,"char")==0)
{
fread(ch,1,WA[0]->FldInfor_P[j-1].FldLen,WA[0]->DbFi_P);
printf("%-10s",Condition1.Value);
fwrite(Condition1.Value,1,WA[0]->FldInfor_P[j-1].FldLen,fp);
}
else if(strcmp(WA[0]->FldInfor_P[j-1].FldClass,"float")==0)
{
fread(&f,sizeof(float),1,WA[0]->DbFi_P);
if(strcmp(Condition1.OPTR,"+")==0)
{
f=f+atof(Condition1.Value);
}
else if(strcmp(Condition1.OPTR,"-")==0)
{
f=f-atof(Condition1.Value);
}
else if(strcmp(Condition1.OPTR,"*")==0)
{
f=f*atof(Condition1.Value);
}
else if(strcmp(Condition1.OPTR,"/")==0)
{
f=f/atof(Condition1.Value);
}
else f=atof(Condition1.Value);
printf("%-10f",f);
fwrite(&f,sizeof(float),1,fp);
}
else
{
fread(&k,sizeof(int),1,WA[0]->DbFi_P);
if(strcmp(Condition1.OPTR,"+")==0)
{
k=k+atoi(Condition1.Value);
}
else if(strcmp(Condition1.OPTR,"-")==0)
{
k=k-atoi(Condition1.Value);
}
else if(strcmp(Condition1.OPTR,"*")==0)
{
k=k*atoi(Condition1.Value);
}
else if(strcmp(Condition1.OPTR,"/")==0)
{
k=k/atoi(Condition1.Value);
}
else k=atoi(Condition1.Value);
printf("%-10d",k);
fwrite(&k,sizeof(int),1,fp);
}
}
else
{
if(strcmp(WA[0]->FldInfor_P[j-1].FldClass,"char")==0)
{
fread(ch,1,WA[0]->FldInfor_P[j-1].FldLen,WA[0]->DbFi_P);
printf("%-10s",ch);
fwrite(ch,1,WA[0]->FldInfor_P[j-1].FldLen,fp);
}
else if(strcmp(WA[0]->FldInfor_P[j-1].FldClass,"float")==0)
{
fread(&f,sizeof(float),1,WA[0]->DbFi_P);
printf("%-10f",f);
fwrite(&f,sizeof(float),1,fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -