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

📄 mydblib.cpp

📁 管理系统
💻 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 + -