#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; } 实现了数据库的基本模型
Linux C程序设计 P274 数据库
精选 转载文章标签 Linux C 数据库 文章分类 数据库
上一篇:lseek函数的用法
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
-
SQL数据库入门06:游标、存储过程的操作及T-SQL程序设计
本文介绍基于Microsoft SQL Server软件,实现数据库T-SQL语言程序设计,以及游标的定义、使用与存储过程的创建、信息查找的方法~
SQL 数据库 SQL Server MySQL 存储过程 -
C语言程序设计P6
1break在while循环中的作用2continue在while循环中的作用3getchar && putchar4for循环
while循环 字符输入 while语句 C语言程序设计教程笔记 -
C语言程序设计P5
1if条件语句2打印奇数代码3switch语句4swtich小练习
赋值 多条语句 无法识别 C语言程序设计教程笔记 -
C语言程序设计P8
循环练习:二分法
二分法 有序数组 数组 C语言程序设计教程