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

📄 dml.h

📁 c语言编写的微型数据库 实现了插入、删除、更新等基本功能
💻 H
📖 第 1 页 / 共 4 页
字号:
#ifndef DML_H
#define DML_H 
#include "Glob_Var.H" 
#include "Std_Head.H" 
#include "Tools.H" 
/* -------------------------------------------------------------------------------------- */
int Do_Remove(char*file)/* 删除文件 */
{
    if(remove(file)==0)
    printf("Removed %s\n",file);
    
    else 
    perror("remove");
    
    return 0 ;
}
/* ------------------------------------------------------------ */
 Do_Insert(CmdRec_Type CmdRec)/* 插入记录值,命令及参数已放在了CmdRec结构中 */
{
    
    
    FILE*fp ;
    int k,j,i,f1,f2 ;
    float f ;
    char ch[20],ch1[20],Tem[20];

    clrscr();

    textbackground(BLUE);

    textcolor(YELLOW);

    strcpy(Tem,CmdRec.UserStr);
    
    ChangeExt(Tem,".TXT"); /* 变文件后缀名 */

    if((WA[0]->DbFi_P=fopen(Tem,"r+b"))==NULL)  /* 打开数据库文件,工作区中指针 DbFi_P指向文件 */

    {
        printf("File open error!\n");
        
        return ;
    }
    
    fseek(WA[0]->DbFi_P,0,SEEK_SET);  /* 定位文件头 */

    fread(WA[0],2,3,WA[0]->DbFi_P);
    /*  读前6个字节,即一级元数据 */
    
    fread(&WA[0]->FldInfor_P[0],(WA[0]->FldNum)*sizeof(struct FldInforStruct),1,WA[0]->DbFi_P);
    /* 读二级元数据,即各字段信息结构,放入 WA[0]->FldInfor_P[MaxFlsLen + 1]中 */

    fclose( WA[0]->DbFi_P);

    if((WA[0]->DbFi_P=fopen(Tem,"r+b"))==NULL)
    {
        printf("File open error!\n");
        
        return ;
    }


    printf("The inserted table is  %s.\n",CmdRec.UserStr);
    
    printf("The insert values are as follows:  ");
    
    printf("\n");
    
    for(i=1;i<=WA[0]->FldNum;i++)
    
    printf("%-10s",WA[0]->FldInfor_P[i-1].FldName);
    
    printf("\n");
    
    for(i=1;i<=WA[0]->FldNum;i++)
    
    printf("%-10s",CmdRec.FldValue[i]);
    
    printf("\n");

    fseek(WA[0]->DbFi_P,4L,SEEK_SET);
    
    j = ++(WA[0]->TotalRec); /* 每插入一条记录,总记录数加1 */

    fwrite(&j,sizeof(int),1,WA[0]->DbFi_P);

    fseek(WA[0]->DbFi_P,0,SEEK_END);

    for(i=1;i<=WA[0]->FldNum;i++) /* 将插入的记录值写入文件 */
    {
        if(strcmp(WA[0]->FldInfor_P[i-1].FldClass,"float")==0)
        {
            f=atof(CmdRec.FldValue[i]);
            fwrite(&f,sizeof(float),1,WA[0]->DbFi_P);
        }
        
        
        else if(strcmp(WA[0]->FldInfor_P[i-1].FldClass,"char")==0)
        
        {
            fwrite(CmdRec.FldValue[i],WA[0]->FldInfor_P[i-1].FldLen,1,WA[0]->DbFi_P);  /* printf("%-10s",CmdRec.FldValue[i]); */
        }
        else 
        {
            k=atoi(CmdRec.FldValue[i]);
            fwrite(&k,sizeof(int),1,WA[0]->DbFi_P);
        }
    }


     fclose( WA[0]->DbFi_P);

     WA[0]->DbFi_P=NULL; /* 关关闭数据文件*/

     WA[0]=NULL;
}
/* ------------------------------------------------------------------------------------------------------ */
/* 比较文件中的所取的浮点数和查询条件中的浮点数 */
char*Compare_F(float f1,Condition_Type Con)
{
    
    
    if(f1>atof(Con.Value))return ">" ;
    
    else if(f1==atof(Con.Value))return "=" ;
    
    else if(f1<atof(Con.Value));
    return "<" ;
    
    /* return "<>" ; */
}

/* 比较文件中的所取的整数和查询条件中的整数 */
char*Compare_I(int i1,Condition_Type Con)
{
    
    
    if(i1>atoi(Con.Value))return ">" ;
    
    else if(i1==atoi(Con.Value))return "=" ;
    
    else if(i1<atoi(Con.Value));
    return "<" ;
    
    /* return "<>" ; */
}

/* 比较文件中的所取的字符串和查询条件中的字符串 */
char*Compare_C(char*c1,Condition_Type Con)
{
    
    
    if(strcmp(c1,Con.Value)>0)return ">" ;
    
    else if(strcmp(c1,Con.Value)==0)return "=" ;
    
    else if(strcmp(c1,Con.Value)<0);
    return "<" ;
    
    /*  return "<>" ; */
}
/*---------------------------------------------------------------------------------------------------- */
/* 执行选择操作,命令以放入CmdRec结构中 */
Do_Select(CmdRec_Type CmdRec,char*Token)
{
    Condition_Type Condition ;
    
    char Vector[150];
    
    char cha[6],ch1[20];
    
    int HeadSize,len1=0 ;
    
    int i=0,k,j,n,m,w ;
    
    char Tem[20],Tem1[20];
    
    float f ;
    
    char ch[10];

     clrscr();

     textbackground(BLUE);

     textcolor(YELLOW);

    CutBlank_Head_Tail(Token);
    
    strncpy(Token,&Token[5],strlen(Token)-4);
    
    CutBlank_Head_Tail(Token);

    for(i=0;i<strlen(Token);i++) /* 取得运算符在查询条件数组中的位置,以便将字段,运算符,值放入结构Condition中 */
    {
        if(Token[i]=='='||Token[i]=='<'||Token[i]=='>')
        
        break ;
        
    }
    
    k=i ;
    
    strncpy(Condition.WhichFld,Token,k); Condition.WhichFld[k] = '\0'; /* 把运算符之前的字符串放入Condition.WhichFld */

    if(Token[k+1]=='>'||Token[k+1]=='<')   /* 把运算符放入Condition.OPTR */
    {
        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);
    }

    strcpy(Tem,CmdRec.UserStr);
    
    strcat(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);
    
    HeadSize=6+(WA[0]->FldNum)*sizeof(struct FldInforStruct);
    
    printf("The records you select are as follows:\n");

    for(i=0;i<WA[0]->FldNum;i++) /* 显示字段值 */

    {
        if(strlen(CmdRec.Range)==1)
            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 ;

    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].FldClass,"char")==0)
                    
                    {
                        fread(ch1,1,WA[0]->FldInfor_P[j-1].FldLen,WA[0]->DbFi_P);
                        
                    if(strlen(CmdRec.Range)==1)   /* 输出范围为*个字段均输出 */

                        {
                            printf("%-10s",ch1);
                        }

                        else if(strstr(CmdRec.Range,strupr(WA[0]->FldInfor_P[j-1].FldName))) /* 输出用户所要求的字段值 */
                        {
                            printf("%-10s",ch1);
                        }
                        
                    }
                    else if(strcmp(WA[0]->FldInfor_P[j-1].FldClass,"float")==0)
                    
                    {
                        fread(&f,sizeof(float),1,WA[0]->DbFi_P);

                        if(strlen(CmdRec.Range)==1)
                        
                        printf("%-10f",f);
                        
                        else if(strstr(CmdRec.Range,strupr(WA[0]->FldInfor_P[j-1].FldName)))
                        
                        printf("%-10f",f);
                        
                    }
                    else 
                    {
                        fread(&k,sizeof(int),1,WA[0]->DbFi_P);
                        
                        if(strlen(CmdRec.Range)==1)
                        
                        printf("%-10d",k);
                        
                        else if(strstr(CmdRec.Range,strupr(WA[0]->FldInfor_P[j-1].FldName)))
                        
                        printf("%-10d",k);
                    }
                }
                
                printf("\n");
                
            }
            break ;
            case 4 :  /* 字符型,处理同整型 */

            if(strcmp(Compare_C(ch,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].FldClass,"char")==0)
                    
                    {
                        fread(ch1,1,WA[0]->FldInfor_P[j-1].FldLen,WA[0]->DbFi_P);
                        
                        if(strlen(CmdRec.Range)==1)
                        
                        printf("%-10s",ch1);
                        
                        else if(strstr(CmdRec.Range,strupr(WA[0]->FldInfor_P[j-1].FldName)))
                        
                        printf("%-10s",ch1);
                        
                        
                    }
                    else if(strcmp(WA[0]->FldInfor_P[j-1].FldClass,"float")==0)
                    
                    {
                        fread(&f,sizeof(float),1,WA[0]->DbFi_P);
                        
                        if(strlen(CmdRec.Range)==1)
                        
                        printf("%-10f",f);
                        
                        else if(strstr(CmdRec.Range,strupr(WA[0]->FldInfor_P[j-1].FldName)))
                        
                        printf("%-10f",f);
                        
                        
                    }
                    else 
                    {
                        fread(&k,sizeof(int),1,WA[0]->DbFi_P);
                        
                        if(strlen(CmdRec.Range)==1)
                        
                        printf("%-10d",k);
                        
                        else if(strstr(CmdRec.Range,strupr(WA[0]->FldInfor_P[j-1].FldName)))
                        
                        printf("%-10d",k);
                        
                        
                        
                    }
                }
                
                printf("\n");
                
            }
            
            break ;
            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -