📄 mydblib.cpp
字号:
//此文件不能进行修改!!!
#include "mydblib.h"
#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct db_hand {
int lines; //总有效记录条数
int max; //最大记录号
}mydbhand;
struct index_info {
int id; //ID号
int mainoff; //主文件偏移,如为-1表示此记录被删除
int remarkoff; //备注文件偏移
}myindexinfo;
//从索引文件中得到索引信息
//返回值=0表示失败,等于1成功
//信息在myindexinfo中
char Sel_ID(int id,char *filename)
{
FILE *fp;
int re;
id--;
if(id<0) return 0;
if(!(fp=fopen(filename,"rb"))) return 0;
fread(&mydbhand.lines,sizeof(db_hand),1,fp);
if(mydbhand.max<id) {
re=0;
}
else
{
fseek(fp,sizeof(index_info)*id,SEEK_CUR);
fread(&myindexinfo.id,sizeof(index_info),1,fp);
if(myindexinfo.mainoff==-1) re=0; //-1为删除标志
else re=1;
}
fclose(fp);
return re;
}
int Sel_NextID(int id,char *filename)
{
FILE *fp;
id++;
if(id<0) return 0;
if(!(fp=fopen(filename,"rb"))) return 0;
fread(&mydbhand.lines,sizeof(db_hand),1,fp);
if(mydbhand.max<id) {
fclose(fp);
return 0;
}
fseek(fp,sizeof(index_info)*(id-1),SEEK_CUR);
while(mydbhand.max>=id)
{
fread(&myindexinfo.id,sizeof(index_info),1,fp);
if(myindexinfo.mainoff != -1)
{
fclose(fp);
return id;
}
id++;
}
fclose(fp);
return 0;
}
//主文件名,备注文件名,索引文件名,写入的字节数
//写入主文件的内容,备注字符串
//如果没有备注,请设置remarkfn的指针为NULL
//返回1表示成功,0表示失败
char db_add(char *mainfn,char *remarkfn,char *indexfn,
int writesize,const void *buffer,const char *remark)
{
FILE *mainfp,*remarkfp,*indexfp;
if(!(mainfp=fopen(mainfn,"ab"))) return 0;
if(!(indexfp=fopen(indexfn,"r+b")))
{
fclose(mainfp);
return 0;
}
if(remarkfn != NULL)
{
if(!(remarkfp=fopen(remarkfn,"ab")))
{
fclose(mainfp);
fclose(indexfp);
return 0;
}
}
fseek(mainfp,0L,SEEK_END); //写主文件
myindexinfo.mainoff=ftell(mainfp);
fwrite(buffer,writesize,1,mainfp);
if(remarkfn != NULL) //有备注
{
fseek(remarkfp,0L,SEEK_END);
myindexinfo.remarkoff=ftell(remarkfp);
fprintf(remarkfp,"%s\n",remark);
}
else myindexinfo.remarkoff=-1;
//修改数据库信息,并加上一条新索引
fread(&mydbhand.lines,sizeof(db_hand),1,indexfp);
mydbhand.lines++;
mydbhand.max++;
fseek(indexfp,0L,SEEK_SET);
fwrite(&mydbhand.lines,sizeof(db_hand),1,indexfp);
myindexinfo.id=mydbhand.max;
fseek(indexfp,0L,SEEK_END);
fwrite(&myindexinfo.id,sizeof(index_info),1,indexfp);
fclose(mainfp);
fclose(indexfp);
if(remarkfn != NULL) fclose(remarkfp);
return 1;
}
//ID为要编辑的ID号,其它同上
//编辑备注文件时,没有删除原记录,而是增加了一条
char db_edit(char *mainfn,char *remarkfn,char *indexfn,int id,
int writesize,const void *buffer,const char *remark)
{
//查找此ID号是否存在并得到信息
if(Sel_ID(id,indexfn)==0) return 0;
FILE *mainfp,*remarkfp,*indexfp;
if(!(indexfp=fopen(indexfn,"r+b"))) return 0;
if(!(mainfp=fopen(mainfn,"r+b"))) {
fclose(indexfp);
return 0;
}
if(remarkfn != NULL)
{
if(!(remarkfp=fopen(remarkfn,"ab")))
{
fclose(mainfp);
fclose(indexfp);
return 0;
}
}
fseek(mainfp,myindexinfo.mainoff,SEEK_SET); //写主文件
fwrite(buffer,writesize,1,mainfp);
fclose(mainfp);
if(remarkfn != NULL) //有备注
{
fseek(remarkfp,0L,SEEK_END);
myindexinfo.remarkoff=ftell(remarkfp);
fprintf(remarkfp,"%s\n",remark);
fclose(remarkfp);
}
else myindexinfo.remarkoff=-1;
//修改数据库索引信息
long offset;
offset=sizeof(index_info)*(id-1)+sizeof(mydbhand);
fseek(indexfp,offset,SEEK_SET);
fwrite(&myindexinfo.id,sizeof(index_info),1,indexfp);
fclose(indexfp);
return 1;
}
//删除记录,仅做标志!
char db_del(char *indexfn,int id)
{
FILE *indexfp;
long offset;
if(Sel_ID(id,indexfn)==0) return 0;
mydbhand.lines--;
offset=sizeof(index_info)*(id-1)+sizeof(db_hand);
myindexinfo.mainoff=-1;
myindexinfo.remarkoff=-1;
if(!(indexfp=fopen(indexfn,"r+b"))) return 0;
fwrite(&mydbhand.lines,sizeof(db_hand),1,indexfp);
fseek(indexfp,offset,SEEK_SET);
fwrite(&myindexinfo.id,sizeof(index_info),1,indexfp);
fclose(indexfp);
return 1;
}
char db_read(char *mainfn,char *remarkfn,char *indexfn,int id,
int readsize,void *buffer,int readsize1,char *remark)
{
FILE *mainfp,*remarkfp;
if(Sel_ID(id,indexfn)==0) return 0;
if(!(mainfp=fopen(mainfn,"rb"))) return 0;
fseek(mainfp,myindexinfo.mainoff,SEEK_SET);
fread(buffer,readsize,1,mainfp);
fclose(mainfp);
if(remarkfn != NULL)
{
if(!(remarkfp=fopen(remarkfn,"rb"))) return 0;
fseek(remarkfp,myindexinfo.remarkoff,SEEK_SET);
fgets(remark,readsize1,remarkfp);
fclose(remarkfp);
}
return 1;
}
int db_next(char *mainfn,char *remarkfn,char *indexfn,int id,
int readsize,void *buffer,int readsize1,char *remark)
{
int re;
re=Sel_NextID(id,indexfn);
if(re==0) return 0;
if(db_read(mainfn,remarkfn,indexfn,re,
readsize,buffer,readsize1,remark)==0) return 0;
return re;
}
char db_getinfo(char *indexfn)
{
FILE *fp;
if(!(fp=fopen(indexfn,"rb"))) return 0;
fread(&mydbhand.lines,sizeof(db_hand),1,fp);
fclose(fp);
return 1;
}
//返回值=0表示成功,其他为出错代码
char db_remakeall(char *mainfn,char *remarkfn,char *indexfn,
int size1,int size2)
{
FILE *indexfp,*tempfp,*tempfp1;
char tempfile[60];
char tempfile1[60];
char tempindex[60];
char tmpstr[]="$$$";
//在文件名后加上tmpstr做为临时文件
strcpy(tempfile,mainfn);
strcat(tempfile,tmpstr);
if(remarkfn !=NULL)
{
strcpy(tempfile1,remarkfn);
strcat(tempfile1,tmpstr);
}
strcpy(tempindex,indexfn);
strcat(tempindex,tmpstr);
if(!(tempfp=fopen(tempfile,"wb"))) return 1;
if(remarkfn !=NULL)
{
if(!(tempfp1=fopen(tempfile1,"wb")))
{
fclose(tempfp);
return 1;
}
}
db_getinfo(indexfn);
struct index_info *indexinfo;
char *buf1,*buf2;
int i=1,id,s;
s=sizeof(index_info)*mydbhand.lines;
indexinfo = (index_info*)malloc(s);
if(indexinfo==NULL) return 2;
buf1=(char *)malloc(size1);
if(buf1==NULL) return 2;
if(remarkfn !=NULL)
{
buf2=(char *)malloc(size2);
if(buf2==NULL) return 2;
}
id=0;
do {
id=db_next(mainfn,remarkfn,indexfn,id,size1,buf1,size2,buf2);
if(id==0) break;
indexinfo[i-1].id=i;
indexinfo[i-1].mainoff=ftell(tempfp);
fwrite(buf1,size1,1,tempfp);
if(remarkfn !=NULL) {
indexinfo[i-1].remarkoff=ftell(tempfp1);
//fprintf(tempfp1,"%s\n",buf2);
fputs(buf2,tempfp1);
}
else indexinfo[i-1].remarkoff=-1;
i++;
} while(id !=0);
fclose(tempfp);
free(buf1);
if(remarkfn !=NULL)
{
fclose(tempfp1);
free(buf2);
}
mydbhand.max=mydbhand.lines;
if(!(indexfp=fopen(tempindex,"wb"))) return 1;
fwrite(&mydbhand.lines,sizeof(db_hand),1,indexfp);
fwrite(&indexinfo[0],s,1,indexfp);
fclose(indexfp);
free(indexinfo);
int re;
re=remove(mainfn);
if(re ==-1) return 3;
re=rename(tempfile,mainfn);
if(re !=0) return 4;
if(remarkfn !=NULL)
{
re=remove(remarkfn);
if(re ==-1) return 3;
re=rename(tempfile1,remarkfn);
if(re !=0) return 4;
}
re=remove(indexfn);
if(re ==-1) return 3;
re=rename(tempindex,indexfn);
if(re !=0) return 4;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -