数据结构10
4.3 重要程序段3
void alterBook()
{
Book book; //fread读取内容的结构变量
FILE *pf = fopen("book.bin", "rb+");
char strBno[10];
char ch;
int count=0;
if (pf == NULL) {
printf("打开book.bin文件失败啦!!\n");
exit(1);
}
printf("请输入要修改的图书编号:");
scanf("%s",strBno);
fseek(pf, 0, SEEK_SET); //文件指针移到最前头
while(fread(&book, sizeof(Book),1, pf) == 1)
{
//状态为1的才显示(未删除),且输入的编号存在
if (book.state == 1 &&(strcmp(strBno, book.bno) == 0))
{
printf("%-10s %-10s %-8s %-15s %-8s %-10s\n","编号","名称","作者","出版日期","价格","数量");
printf("%-10s %-11s %-7s %-13.10s ¥%-9.2f %d\n"
,book.bno,book.name,book.author,book.pubDate,book.price,book.quantity);
printf("找到以上书籍,是否要修改(y/n[a-z]): ");
getchar();
scanf("%c",&ch);
if (ch == 'y' || ch == 'Y') {
//将文件指针位置定位到该条记录指针的上一条数据,在执行写入就是更新此条记录
fseek(pf, (long)(ftell(pf) - sizeof(Book)),0);
book.state = 1; //默认1(未删除)
strcpy(book.bno, strBno); //字符串赋值
printf("图书名称:");
scanf("%s",book.name);
printf("图书作者:");
scanf("%s",book.author);
printf("出版日期(yyyy-mm-dd):");
scanf("%s",book.pubDate);
printf("图书价格:");
scanf("%f",&book.price);
printf("图书数量:");
scanf("%d",&book.quantity);
if(fwrite(&book, sizeof(Book), 1, pf))
printf("修改成功!");
else
printf("修改失败!(error:401)");
count = 0;
break;
}
break;
}
else{
count = 1;
}
}
if (count)
printf("未找到该图书信息!(error:402)\n");
fclose(pf);
}
4.4 重要程序段4
void addBook()
{
FILE *pf = fopen("Book.bin", "rb+");
Book *head = (Book*)malloc(sizeof(Book));//创建一个头结点
Book *node = head; //创建一个节点指向头结点,用于遍历
Book *pb; //定义一个指针申请内存写入数据
Book book;
int success=0; //用于计算录入成功的数量
int fail = 0;
int count = 0;
char ch;
if (pf == NULL) {
printf("打开book.bin文件失败啦!!\n");
exit(1);
}
printf("录入图书信息(y/n):");
getchar();
scanf("%c",&ch);
while(ch == 'y' || ch == 'Y')
{
getchar();
pb = (Book*)malloc(sizeof(Book));
pb->state = 1; //录入图书状态默认是1
printf("图书编号:");
scanf("%s",pb->bno);
printf("图书名称:");
scanf("%s",pb->name);
printf("图书作者:");
scanf("%s",pb->author);
printf("出版日期(yyyy-mm-dd):");
scanf("%s",pb->pubDate);
printf("图书价格:");
scanf("%f",&pb->price);
printf("图书数量:");
scanf("%d",&pb->quantity);
pb->next = NULL; //初始化下一个节点为NULL
node->next = pb;
node = node->next;
printf("是否继续录入(y/n[a-z]):");
getchar();
scanf("%c",&ch);
}
fseek(pf, 0, SEEK_END);//文件指针位置移到最后
//遍历链表
for (head=head->next; head; head=head->next) {
count = 0;
//循环读取文件内容,判断图书编号是否存在,存在则录入失败
fseek(pf, 0, SEEK_SET); //文件指针移到最前头
while(fread(&book, sizeof(Book),1, pf) == 1){
//判断该书是否存在
if (strcmp(book.bno, head->bno) == 0 && book.state == 1) {
count = 1;
fail++;
break;
}
}
//如果录入的书不存在,则文件指针位置移到最后,然后把该图书信息写文件里。
if(count != 1){
fseek(pf, 0, SEEK_END);
fwrite(head, sizeof(Book), 1, pf);
success++;
}
}
printf("一共录入:%d本书 成功录入:%d 本 失败(已存在):%d 本\n",success+fail,success,fail);
fclose(pf); //关闭文件
}
4.5 重要程序段5
void borrowBooks()
{
FILE *pf = fopen("user.bin", "rb+");
FILE *pfb = fopen("book.bin", "rb+");
Book book;
User user;
User usertemp;
int is=1;
int t=0;
char ch;
long date=0;
if (pf == NULL) {
printf("打开user.bin文件失败啦!!\n");
exit(1);
}
if (pfb == NULL) {
printf("打开book.bin文件失败啦!!\n");
exit(1);
}
do{
printf("请输入你的学号:");
scanf("%s",user.id);
//文件指针移到最前头
fseek(pf, 0, SEEK_SET);
//如果是新用户要求输入姓名
while(fread(&usertemp, sizeof(User),1, pf) == 1){
if (strcmp(usertemp.id, user.id) == 0) {
strcpy(user.name, usertemp.name);
is = 0;
break;
}
}
if (is) {
printf("请输入你的姓名(新用户):");
scanf("%s",user.name);
}
printf("请输入借阅的图书编号:");
scanf("%s",user.u_bno);
fseek(pf, 0, SEEK_SET);
//判断是否借过该书,不能重复借同一本书
while(fread(&usertemp, sizeof(User),1, pf) == 1){
if (strcmp(usertemp.u_bno, user.u_bno) == 0 && strcmp(usertemp.id, user.id) == 0
&&usertemp.quantity != 0) {
is = 2;
break;
}
}
user.quantity = 1; //默认每种图书只能借一本
fseek(pf, 0, SEEK_END);//pf文件指针位置移到最后
fseek(pfb, 0, SEEK_SET);//pfb文件指针位置移到最前
//判断该图书是否存在才能借阅
while(fread(&book, sizeof(Book),1, pfb) == 1 && is!=2){
if (strcmp(book.bno, user.u_bno) == 0 && book.state == 1) {
if (book.quantity >= user.quantity) {
time(&date); //将时间变量赋值为系统当前时间的时间戳
metis_strftime(date, user.date); //记录借阅时间
fwrite(&user, sizeof(User), 1, pf);
printf("借阅成功!书名:%s 借阅数量:%d\n",book.name,user.quantity);
book.quantity -= user.quantity;
//定位到该条图书信息指针文件位置,然后更新被借走的数量
fseek(pfb, (long)(ftell(pfb) - sizeof(Book)),0);
fwrite(&book, sizeof(Book), 1, pfb);
t = 0;
break;
}
else{
printf("借阅失败,该图书库存不足!(error:601)\n",book.quantity);
t=0;
break;
}
}
else{
t = 1;
}
}
if (t)
printf("借阅失败该书编号不存在!(error:602)\n");
else if (is == 2)
printf("你已借阅该图书,不能重复借阅!(error:603)\n");
printf("是否继续借阅(y/n[a-z]):");
getchar();
scanf("%c",&ch);
}while(ch == 'y' || ch == 'Y');
fclose(pf); //关闭文件
fclose(pfb); //关闭文件
}
4.6 重要程序段6
void revertBook()
{
FILE *pf = fopen("user.bin", "rb+");
FILE *pfb = fopen("book.bin", "rb+");
Book book;
User user;
User utemp;
char rbno[50];
char utid[20];
char ch;
int count = 0;
if (pf == NULL) {
printf("打开user.bin文件失败啦!!\n");
exit(1);
}
if (pfb == NULL) {
printf("打开book.bin文件失败啦!!\n");
exit(1);
}
do{
printf("请输入你的学号:");
scanf("%s",user.id);
strcpy(utid, user.id);
//文件指针移到最前头
fseek(pf, 0, SEEK_SET);
//学号存在才能归还
while(fread(&utemp, sizeof(User),1, pf) == 1){
if (strcmp(user.id, utemp.id) == 0) {
count = 1;
break;
}
}
fseek(pf, 0, SEEK_SET);//pf文件指针位置移到最前
if(count == 1){
printf("以下是你借阅的书籍:\n");
printf("%-10s %-15s %-16s %-24s\n","学号","图书编号","图书名称","借阅日期");
while(fread(&utemp, sizeof(User),1, pf) == 1){
fseek(pfb, 0, SEEK_SET);//pfb文件指针位置移到最前
while (fread(&book, sizeof(Book), 1, pfb)==1 && (strcmp(user.id, utemp.id) ==0)) {
if (strcmp(utemp.u_bno,book.bno)==0 && utemp.quantity==1) {
printf("%-10s %-15s %-13s %s\n"
,utemp.id,book.bno,book.name,utemp.date);
}
}
}
printf("请输入你要归还的图书编号:");
scanf("%s",rbno);
fseek(pfb, 0, SEEK_SET);//pf文件指针位置移到最前
fseek(pf, 0, SEEK_SET);//pf文件指针位置移到最前
while(fread(&book, sizeof(Book), 1, pfb)==1){
if (strcmp(book.bno,rbno) == 0) {
book.quantity+=1; //用户归还库存+1
//定位到该条图书信息指针文件位置,然后更新还书数量
fseek(pfb, (long)(ftell(pfb) - sizeof(Book)),0);
fwrite(&book, sizeof(Book), 1, pfb);
count = 2;
break;
}
else{
count = 3;
}
}
while(fread(&user, sizeof(User), 1, pf)==1){
if (strcmp(user.id,utid) == 0 && strcmp(user.u_bno,rbno) == 0
&&user.quantity != 0){
user.quantity = 0; // 用户归还后-1;
//定位到该条图书信息指针文件位置,然后更新还书信息
fseek(pf, (long)(ftell(pf) - sizeof(User)),0);
fwrite(&user, sizeof(User), 1, pf);
count = 2;
break;
}
else{
count = 3;
}
}
}
else{
printf("系统未查询到该学号所借阅的图书!(error:701)\n");
}
if (count == 2) {
printf("还书成功!\n");
}
else if(count == 3){
printf("还书失败,你未借阅该图书!(error:702)\n");
}
printf("是否继续归还(y/n[a-z]):");
getchar();
scanf("%c",&ch);
}while(ch == 'y' || ch == 'Y');
fclose(pf);
fclose(pfb);
}