#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;
}




实现了数据库的基本模型