c简易实现本地数据库
这个数据库一共用到两个头文件
#include"dbtype.h" #include"XperditDB.h"
dbtype.h提供了一个PList双向链表可以对数据库进行精确的操作
XperditDB.h提供了table一个数据库容器来对数据库进行增删改查
下面是方法介绍:
initTable(table t)对table变量进行初始化
createTable(PList typeName,char *TabName,table &t)创建一个新的table,其中typeName为一个Plist,它存放了储存的数据名称,TabName为数据库在本地的名称
getTable(char *tableName,table &t)获取一个已经存在的table,tableName为已经存在的本地数据库名称
clearTable(table &t)释放table,但不破坏本地数据库
insert2Table(table &t,PList item)像table中插入数据,item为插入的数据
delTableElem(table &t,int id)删除ID=id的那一列数据
getElemInTableFromID(table t,int id)通过id获取那一列数据
getElemIDInTableFromChar(table t,char *type,char *item)通过类型名和内容返回该列的id 通常搭配getElemInTableFromID使用
updateDB(table t)将t同步到本地的数据库
readTable(table t)在命令行中显示t的所有内容
initList(PList &p)初始化Plist
PList的基本函数就不写了 详见dbtype.h
下面附上源码:
dbtype.h
#ifndef DBTYPE_H #define DBTYPE_H #include<stdio.h> #include<malloc.h> #include<string.h> #define ERROR -1 typedef struct list *PList; typedef struct Node *PNode; typedef char *Elem; struct list{ int ava; PNode head; PNode tail; }; struct Node{ Elem elem; PNode next; }; int initNode(PNode &p){ if(!(p=(PNode)malloc(sizeof(Node)))){ free(p); return ERROR; } p->next=NULL; return 1; } int initList(PList &p){ if(!(p=(PList)malloc(sizeof(list)))){ free(p); return ERROR; } PNode pp; initNode(pp); p->head=NULL; p->tail=NULL; p->ava=1; return 1; } int isEmpty(PList p){ if(p->ava==1) return 1; return 0; } void append(PList p,Elem elem){ PNode pp; initNode(pp); int len=strlen(elem)+1; pp->elem=(Elem)malloc(sizeof(char)*len); strcpy(pp->elem,elem); if(!(p->head)){ p->head=pp; p->tail=pp; }else{ p->tail->next=pp; p->tail=pp; } } int getlen(PList p){ PNode pp=p->head; int re=0; while(pp){ ++re; pp=pp->next; } return re; } void readAllList(PList p){ if(!isEmpty(p)){ return; } PNode pp=p->head; while(pp){ printf("%c",pp->elem); pp=pp->next; } printf(" "); } Elem getElem(PList p,int id){ PNode pp=p->head; int i=1; while(pp){ if(i==id){ return pp->elem; } pp=pp->next; i++; } return 0; } void DelElem(PList p,int id){ PNode pp=p->head; int i=1; if(id==1){ p->head=pp->next; free(pp); }else{ while(pp){ if(i+1==id){ PNode ppp=pp->next; pp->next=ppp->next; free(ppp->elem); free(ppp); } pp=pp->next; i++; } } } void insert(PList p,Elem e,int id){ PNode p2=p->head; PNode p3; initNode(p3); int i=1; if(id==1){ p->head=p3; p3->next=p2; p3->elem=e; }else{ while(p2){ if(i+1==id){ p3->next=p2->next; p2->next=p3; p3->elem=e; } i++; p2=p2->next; } } } void clearList(PList p){ PNode pp=p->head; while(pp){ PNode p3=pp; pp=pp->next; free(p3->elem); free(p3); } free(p); } void listcat(PList p1,PList p2){ p1->tail->next=p2->head; p1->tail=p2->tail; free(p2); } int getid(PList p,char *ch){ PNode n=p->head; int id=1; while(n){ if(strcmp(n->elem,ch)==0){ return id; } id++; n=n->next; } return 0; } #endifXperditDB.h
#ifndef XPERDITDB_H #define XPERDITDB_H #include<stdio.h> #include<string.h> #include<malloc.h> #include <stdlib.h> #include"dbtype.h" typedef char *pchar; typedef struct stable *table; struct stable{ PList type; PList item; char *path; }; char* readFile(char *path){ FILE *fp; char *ch1; char ch; if((fp=fopen(path,"r"))==NULL) { printf("file cannot be opened/n"); } int len=0; while((ch=fgetc(fp))!=EOF) len++; ch1=(char*)malloc(sizeof(char)*((int)(len+1))); strcpy(ch1,""); fclose(fp); if((fp=fopen(path,"r"))==NULL) { printf("file cannot be opened/n"); } int i=0; while((ch=fgetc(fp))!=EOF) { *(ch1+i)=ch; i++; } fclose(fp); return ch1; } void writeFile(char* ch,char* path){ FILE *fp; if((fp=fopen(path,"w"))==NULL) { printf("file cannot be opened/n"); } int len=strlen(ch); for(int i=0;i<len;i++){ fputc(ch[i],fp); } fclose(fp); } char* mix(PList p){ PNode pp=p->head; int len=0; while(pp){ len+=strlen(pp->elem)+1; pp=pp->next; } char *ch=(char*)malloc(sizeof(char)*((len+1)+1)); strcpy(ch,""); pp=p->head; while(pp){ strcat(ch,pp->elem); strcat(ch,"/"); pp=pp->next; } strcat(ch,"<"); clearList(p); return ch; } char* mixTAC(PList p1,PList p2){ char *ch1=mix(p1); char *ch2=mix(p2); int len=strlen(ch1)+strlen(ch2)+2; char *ch=(char*)malloc(sizeof(char)*len); strcpy(ch,""); strcat(ch,ch1); strcat(ch,"*"); strcat(ch,ch2); return ch; } char* strsub(char *ch,int start,int end){ char *cho=(char*)malloc(sizeof(char)*(end-start+2)); int i=start; int j=0; while(*(ch+i)){ *(cho+j)=*(ch+i); if(i==end){ break; } i++; j++; } *(cho+j+1)=0; return cho; } void decodePart(char *ch,PList p){ int i=0; while(*(ch+i)!=47) i++; append(p,strsub(ch,0,i-1)); int len=strlen(ch); if(*(ch+i+1)==60){ return; } decodePart(strsub(ch,i+1,len-1),p); } void decodeDB(char *ch,PList &p1,PList &p2){ char *ch1; char *ch2; int breakp=0; int i=0; while(*(ch+i)){ if(*(ch+i)==42){ break; } i++; } ch1=(char*)malloc(sizeof(char)*(i+1)); ch2=(char*)malloc(sizeof(char)*(strlen(ch)-i)); ch1=strcpy(ch1,""); ch2=strcpy(ch2,""); ch1=strsub(ch,0,i-1); ch2=strsub(ch,i+1,strlen(ch)-1); decodePart(ch1,p1); decodePart(ch2,p2); } void readData(PList &p1,PList &p2){ int len1=getlen(p1); int len2=getlen(p2); for(int j=1;j<=len2;j++){ if(j%len1==0){ printf("%s :",getElem(p1,len1)); }else{ printf("%s :",getElem(p1,j%len1)); } printf("%s ",getElem(p2,j)); } } void getdata(char *path,PList &p1,PList &p2){ char *cho=readFile(path); int k=0; int kk=0; int len=strlen(cho); while(kk!=2){ if(*(cho+k)==60){ kk++; } k++; } char *ch; ch=strsub(cho,0,k); initList(p1); initList(p2); decodeDB(ch,p1,p2); } void writedata(PList p1,PList p2,char *TabName){ char *ch=mixTAC(p1,p2); writeFile(ch,TabName); }; void readDB(char *TabName){ PList p1,p2; getdata(TabName,p1,p2); readData(p1,p2); clearList(p1); clearList(p2); } void initTable(table &t){ t=(table)malloc(sizeof(stable)); } void createTable(PList typeName,char *TabName,table &t) { PList Pobj; initList(Pobj); int len=getlen(typeName); for(int i=0;i<len;i++){ append(Pobj,"NULL"); } initTable(t); t->type=typeName; t->item=Pobj; t->path=TabName; } void updateDB(table t){ writedata(t->type,t->item,t->path); }; void getTable(char *tableName,table &t){ PList p1,p2; initList(p1); initList(p2); initTable(t); getdata(tableName,p1,p2); t->type=p1; t->item=p2; t->path=tableName; } void readTable(table t){ readData(t->type,t->item); } void insert2Table(table &t,PList item){ listcat(t->item,item); int i=0; for(;i<3;i++){ if(strcmp(getElem(t->item,1),"NULL")==0){ DelElem(t->item,1); } } } void delTableElem(table &t,int id){ int lenType=getlen(t->type); PList pit=t->item; for(int i=0;i<lenType;i++){ DelElem(pit,(id-1)*lenType+1); } } void clearTable(table &t){ clearList(t->type); clearList(t->item); free(t); } PList getElemInTableFromID(table t,int id){ int len=getlen(t->type); PList out; initList(out); for(int i=1;i<=len;i++){ append(out,getElem(t->item,len*(id-1)+i)); } return out; } int getElemIDInTableFromChar(table t,char *type,char *item){ int len1=getlen(t->type); int id=getid(t->type,type); int len2=getlen(t->item); int len =len2/len1; for(int i=1;i<=len;i++){ if(strcmp(getElem(t->item,len1*(i-1)+id),item)==0){ return i; } } return 0; } #endif
有需要的话再更新几个demo
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Html5本地存储和本地数据库
- 下一篇: Arrays.sort()总结