#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#define TM_L 14
typedef struct _callist callist;
struct _callist{
long id;
int type;
long telnum;
char btime[TM_L];
long tcount;
float charge_rate;
float charge_sum;
};
int selectdb(callist **cl, int f){
int i=sizeof(callist);
long length=lseek(f,0,SEEK_END);
if(length<i)
{
puts("无记录");
return -1;
}
if(*cl!=NULL)
free(*cl);
*cl=(callist*)malloc(length);
lseek(f,0,SEEK_SET);
if(read(f,*cl,length)!=length){
perror("读取数据失败");
return -2;
}
return 0;
}
int insertdb(callist *cr,int f,callist *cl){
int i=sizeof(callist);
int length=lseek(f,0,SEEK_END);
cr->id=(cl+length/i-1)->id+1;
lseek(f,0,SEEK_END);
if(write(f,cr,i)!=i)
{
perror("插入记录失败");
return -1;
}
return 0;
}
int changedb(callist *cr,int f,callist *cl){
int i=sizeof(callist);
long length=lseek(f,0,SEEK_END);
long j;
for(j=0;j<=length/i;j++){
if((cl+j)->id==cr->id)
break;
}
memcpy(cl+j,cr,i);
lseek(f,0,SEEK_SET);
if(write(f,cl,length)!=length)
{
perror("读取数据失败");
return -1;
}
return 0;
}
int deletedb(callist *cr,int *f,callist **cl){
int i=sizeof(callist);
long length=lseek(*f,0,SEEK_END);
long j;
for(j=0;j<=length/i;j++){
if((*cl+j)->id==cr->id)
break;
}
memmove(*cl+j,*cl+j+1,length-i*(j+1));
length-=i;
close(*f);
*f=open("listdb",O_RDWR | O_TRUNC);
if(write(*f,*cl,length)!=length)
{
perror("读取数据失败");
return -1;
}
return 0;
}
void printdb(callist *cl,int f)
{
int i=sizeof(callist);
long length=lseek(f,0,SEEK_END);
int j;
char btime[TM_L+1]={0};
for(j=0;j<length/i;j++){
memcpy(btime,(cl+j)->btime,TM_L);
printf("%ld,%d,%ld,%14s,%ld,%1.2f,%1.2f\n",
(cl+j)->id,
(cl+j)->type,
(cl+j)->telnum,
btime,
(cl+j)->tcount,
(cl+j)->charge_rate,
(cl+j)->charge_sum);
}
}
int main(){
int f;
int res;
callist cr={1,0,12345,"20090301",30,0.36,0.36}; /*此处,由于字符串长度14,书上的字符串会让程序出错,所以修改为“20090301”*/
callist *cl;
cl=NULL;
f=open("listdb",O_RDWR | O_CREAT,0664);
if(f==-1){
perror("打开文件错误");
return 1;
}
puts("原始文件输出:");
res=selectdb(&cl,f);
if(res==-2)
{
return 1;
}
else if(res==0)
printdb(cl,f);
puts("插入操作后文件书吹:");
insertdb(&cr,f,cl);
res=selectdb(&cl,f);
if(res==-2)
return 1;
else if(res==0)
printdb(cl,f);
puts("修改记录后文件输出:");
cr.telnum=54321;
changedb(&cr,f,cl);
res=selectdb(&cl,f);
if(res==2)
return 1;
else if(res==0)
printdb(cl,f);
puts("删除记录后文件输出:");
deletedb(&cr,&f,&cl);
res=selectdb(&cl,f);
if(res==-2)
return 1;
else if(res==0)
printdb(cl,f);
close(f);
return 0;
}
实现了数据库的基本模型
转载于:https://blog.51cto.com/yuzwei/1655445