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

📄 dml.h

📁 c语言编写的微型数据库 实现了插入、删除、更新等基本功能
💻 H
📖 第 1 页 / 共 4 页
字号:
                
                {
                    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 + -