c语言图书管理系统求助
请问我的bookin 和delbook没办法在程序中增加或者减少数据是不是某个地方错了呢?
就是红色的这两段
要怎样做呢?
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define LEN sizeof(struct Book)
#define DATA book_num,book_name
struct Card
{
char card_num;
char student_name;
int book_totle;
};
struct Card card={{"20111101","Zhanjun",3},{"20111103","YangKai",1},{"20111113","WuGang",4},{"20111123","Shanglei",2},{"20111105","ZhangKun",5}};
struct Date
{
int year;
int month;
int day;
};
struct Book
{
char book_num;
char book_name;
struct Date date;
int flag;
};
struct Book book={{"305032","History",{0,0,0},1},{"409812","Geogrophy",{0,0,0},1},{"213401","English",{0,0,0},1},{"3287463","Maths",{0,0,0},1},{"4102102","Physicyl",{0,0,0},1}};
char num;
void menu();//函数的声明
void borrowbook();
void returnbook();
void bookinquiry();
void bookin();
void readerinquiry();
void readerupdate();
void reborrow();
void delbook();
void borrowbook()
{
int i;
char booknum;
printf("请输入要借阅的书号");
scanf("%s",booknum);
for(i=0;i<5;i++)
{
if(strcmp(booknum,book.book_num)==0)
{
if(book.flag==0)
printf("这本书已经借出!\n");
else
{
book.flag=0;
printf("借出日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
scanf("%d/%d/%d",&book.date.year,&book.date.month,&book.date.day);
break;
}
}
}
for(i=0;i<5;i++)
if(strcmp(num,card.card_num)==0)
{ card.book_totle=card.book_totle+1;
break;
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
void returnbook()
{
int i;
char booknum;
printf("请输入要还的书号");
scanf("%s",booknum);
for(i=0;i<5;i++)
{
if(strcmp(booknum,book.book_num)==0)
{
book.flag=1;
break;
}
if(i>=5)
printf("卡号输入错误!");
for(i=0;i<5;i++)
if(strcmp(num,card.card_num)==0)
{
card.book_totle=card.book_totle+1;
break;
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
}
void bookinquiry()
{
int i;
char booknum;
printf("请输入要查询的书号:");
scanf("%s",booknum);
for(i=0;i<5;i++)
if(strcmp(booknum,book.book_num)==0)
{
printf("编号书名借出日期状态\n");
printf("%s %s",book.book_num,book.book_name);
printf("%4d年%2d月%2d日",book.date.year,book.date.month,book.date.day);
if(book.flag==1)
printf("未借出!\n");
else
printf("已借出!\n");
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void bookin()
{
int i,m=0;/*m是记录的条数*/
char ch;
FILE *fp;/*定义文件指针*/
if((fp=fopen("data","ab+"))==NULL)/*打开指定文件*/
{
printf("不能打开文件!\n");
return;
}
while(!feof(fp))
{
if(fread(&book ,LEN,1,fp)==1)
m++;/*统计当前记录条数*/
}
fclose(fp);
if(m==0)
printf("没有找到!\n");
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
for(i=0;i<m;i++)
fwrite(&book ,LEN,1,fp);/*向指定的磁盘文件写入信息*/
printf("是否输入?(y/n):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息*/
{
printf("号:");
scanf("%d",&book.book_num);
for(i=0;i<m;i++)
if(book.book_num ==book.book_num)
{
printf("该记录已经存在,按任意键继续!");
getch();
fclose(fp);
return;
}
printf("书名:");
scanf("%s",book.book_name);
if(fwrite(&book,LEN,1,fp)!=1)/*将新录入的信息写入指定的磁盘文件*/
{
printf("不能保存!");
getch();
}
else
{
printf("%s 已经保存!\n",book.book_name);
m++;
}
printf("是否继续?(y/n):");/*询问是否继续*/
scanf("%s",ch);
}
fclose(fp);
printf("OK!\n");
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void delbook()
{
FILE *fp;
int snum,i,j,m=0;
char ch;
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开文件\n");
return;
}
while(!feof(fp))
if(fread(&book,LEN,1,fp)==1)
m++;
fclose(fp);
printf("请输入编号:");
scanf("%d",&snum);
for(i=0;i<5;i++)
if(snum==book.book_num)
break;
if(i==m)
{
printf("没有找到!");
getchar();
return;
}
printf("已经找到该记录,是否删除?(y/n)");
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要进行删除*/
{
for(j=i;j<m;j++)
book = book;/*将后一个记录移到前一个记录的位置*/
i--;/*记录的总个数减1*/
printf("成功删除!\n");
}
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开!\n");
return;
}
for(j=0;j<m;j++)/*将更改后的记录重新写入指定的磁盘文件中*/
if(fwrite(&book ,LEN,1,fp)!=1)
{
printf("不能保存!\n");
getch();
}
fclose(fp);
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void readerinquiry()
{
int i;
char studentname;
printf("请输入要查询的读者");
scanf("%s",studentname);
for(i=0;i<5;i++)
if(strcmp(studentname,card.student_name)==0)
{
printf("借书证号姓名书名借出日期\n");
printf("%s %s %s",card.card_num,card.student_name,book.book_name);
printf("%4d年%2d月%2d日\n",book.date.year,book.date.month,book.date.day);
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
void readerupdate()
{
printf("这是添加与删除读者的函数\n");
}
void reborrow()
{
int i;
char booknum;
printf("请输入要续借的书号");
scanf("%s",booknum);
for(i=0;i<5;i++)
if(strcmp(booknum,book.book_num)==0)
{
printf("编号书名借出日期状态\n");
printf("%s %s",book.book_num,book.book_name);
printf("%4d年%2d月%2d日",book.date.year,book.date.month,book.date.day);
if(book.flag==1)
printf("不能续借!\n");
else
printf("可以续借!\n");
}
printf("1.确认续借 2.取消续借");
scanf("%d",&i);
if(i==1)
{
book.flag=0;
printf("续借日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
scanf("%d/%d/%d",&book.date.year,&book.date.month,&book.date.day);
}
else
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
void menu()
{
int n;
printf("~~~欢迎使用本校图书管理系统~~~\n");
printf("*******************************\n");
printf("1.借书\n");
printf("2.还书\n");
printf("3.图书查询\n");
printf("4.新书上架\n");
printf("5.旧书下架\n");
printf("6.读者查询\n");
printf("7.添加与删除读者\n");
printf("8.续借\n");
printf("9.退出\n");
printf("请选择以上选项:\n");
printf("*******************************\n");
scanf("%d",&n);
switch(n)
{
case 1:borrowbook();break;
case 2:returnbook();break;
case 3:bookinquiry();break;
case 4:bookin();break;
case 5:delbook();break;
case 6:readerinquiry();break;
case 7:readerupdate();break;
case 8:reborrow();break;
case 9:exit(0);break;
default:printf("输入错误,退出\n");exit(0);break;
}
}
void main()
{
int i;
char num;
printf("请输入你的卡号");
scanf("%s",num);
for(i=0;i<5;i++)
if(strcmp(num,card.card_num)==0)
break;
if(i>=5)
{
printf("卡号不存在!");
exit(0);
}
else
menu();
}
book的book_num定义的是字符数组,所以bookin函数里:
scanf("%d", &book.book_num);
if (book.book_num == book.book_num)
应该改成:
scanf("%s", book.book_num);
if (strcmp(book.book_num, book.book_num) == 0)
delbook函数里判断书号也是类似的问题:
if (snum == book.book_num)
snum定义的是int,而book_num是字符数组。
动态添加删除改成用链表实现比较好吧。网上有很多例子,本论坛也有很多贴子。 superbe 发表于 2019-12-23 21:39
book的book_num定义的是字符数组,所以bookin函数里:
scanf("%d", &book.book_num);
if (book.bo ...
非常感谢,这个问题困扰我好几天。
你的回答很好的帮助了我。
新手新手
链表的话还没有学到,后续一定会补上这部分内容{:10_257:} superbe 发表于 2019-12-23 21:39
book的book_num定义的是字符数组,所以bookin函数里:
scanf("%d", &book.book_num);
if (book.bo ...
你好,如果按照现在这种方法的话删除(delbook)要怎么做
我的bookin和delbook都是从其他类似的搬过来的
现在的话添加(bookin)已经能好了
但是delbook不能操作
请问是哪里有问题呢?
要怎么修改呢?
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define LEN sizeof(struct Book)
#define DATA book_num,book_name
struct Card
{
char card_num;
char student_name;
int book_totle;
};
struct Card card={{"20111101","Zhanjun",3},{"20111103","YangKai",1},{"20111113","WuGang",4},{"20111123","Shanglei",2},{"20111105","ZhangKun",5}};
struct Date
{
int year;
int month;
int day;
};
struct Book
{
char book_num;
char book_name;
struct Date date;
int flag;
};
struct Book book={{"305032","History",{0,0,0},1},{"409812","Geogrophy",{0,0,0},1},{"213401","English",{0,0,0},1},{"3287463","Maths",{0,0,0},1},{"4102102","Physicyl",{0,0,0},1}};
char num;
void menu();//函数的声明
void borrowbook();
void returnbook();
void bookinquiry();
void bookin();
void readerinquiry();
void readerupdate();
void reborrow();
void delbook();
void borrowbook()
{
int i;
char booknum;
printf("请输入要借阅的书号");
scanf("%s",booknum);
for(i=0;i<5;i++)
{
if(strcmp(booknum,book.book_num)==0)
{
if(book.flag==0)
printf("这本书已经借出!\n");
else
{
book.flag=0;
printf("借出日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
scanf("%d/%d/%d",&book.date.year,&book.date.month,&book.date.day);
break;
}
}
}
for(i=0;i<5;i++)
if(strcmp(num,card.card_num)==0)
{ card.book_totle=card.book_totle+1;
break;
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
void returnbook()
{
int i;
char booknum;
printf("请输入要还的书号");
scanf("%s",booknum);
for(i=0;i<5;i++)
{
if(strcmp(booknum,book.book_num)==0)
{
book.flag=1;
break;
}
if(i>=5)
printf("卡号输入错误!");
for(i=0;i<5;i++)
if(strcmp(num,card.card_num)==0)
{
card.book_totle=card.book_totle+1;
break;
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
}
void bookinquiry()
{
int i;
char booknum;
printf("请输入要查询的书号:");
scanf("%s",booknum);
for(i=0;i<5;i++)
if(strcmp(booknum,book.book_num)==0)
{
printf("编号书名借出日期状态\n");
printf("%s %s",book.book_num,book.book_name);
printf("%4d年%2d月%2d日",book.date.year,book.date.month,book.date.day);
if(book.flag==1)
printf("未借出!\n");
else
printf("已借出!\n");
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void bookin()
{
int i,m=0;/*m是记录的条数*/
char ch;
FILE *fp;/*定义文件指针*/
if((fp=fopen("data","ab+"))==NULL)/*打开指定文件*/
{
printf("不能打开文件!\n");
return;
}
while(!feof(fp))
{
if(fread(&book ,LEN,1,fp)==1)
m++;/*统计当前记录条数*/
}
fclose(fp);
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
for(i=0;i<m;i++)
fwrite(&book ,LEN,1,fp);/*向指定的磁盘文件写入信息*/
printf("是否输入?(y/n):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息*/
{
printf("图书编号:");
scanf("%s",book.book_num);
for(i=0;i<m;i++)
if (strcmp(book.book_num, book.book_num) == 0)
{
printf("该记录已经存在\n");
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
printf("书名:");
scanf("%s",book.book_name);
if(fwrite(&book,LEN,1,fp)!=1)/*将新录入的信息写入指定的磁盘文件*/
{
printf("不能保存!");
getch();
}
else
{
printf("%s 已经保存!\n",book.book_name);
m++;
}
printf("是否继续?(y/n):");/*询问是否继续*/
scanf("%s",ch);
}
fclose(fp);
printf("OK!\n");
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void delbook()
{
FILE *fp;
int i,j,m=0;
char snum;
char ch;
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开文件\n");
return;
}
while(!feof(fp))
if(fread(&book,LEN,1,fp)==1)
m++;
fclose(fp);
printf("请输入编号:");
scanf("%s",snum);
for(i=0;i<5;i++)
if (strcmp(snum, book.book_num) == 0)
printf("已经找到该记录,是否删除?(y/n)");
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要进行删除*/
{
for(j=i;j<m;j++)
book = book;/*将后一个记录移到前一个记录的位置*/
i--;/*记录的总个数减1*/
printf("成功删除!\n");
}
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开!\n");
return;
}
for(j=0;j<m;j++)/*将更改后的记录重新写入指定的磁盘文件中*/
if(fwrite(&book ,LEN,1,fp)!=1)
{
printf("不能保存!\n");
getch();
}
fclose(fp);
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void readerinquiry()
{
int i;
char studentname;
printf("请输入要查询的读者");
scanf("%s",studentname);
for(i=0;i<5;i++)
if(strcmp(studentname,card.student_name)==0)
{
printf("借书证号姓名书名借出日期\n");
printf("%s %s %s",card.card_num,card.student_name,book.book_name);
printf("%4d年%2d月%2d日\n",book.date.year,book.date.month,book.date.day);
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
void readerupdate()
{
printf("这是添加与删除读者的函数\n");
}
void reborrow()
{
int i;
char booknum;
printf("请输入要续借的书号");
scanf("%s",booknum);
for(i=0;i<5;i++)
if(strcmp(booknum,book.book_num)==0)
{
printf("编号书名借出日期状态\n");
printf("%s %s",book.book_num,book.book_name);
printf("%4d年%2d月%2d日",book.date.year,book.date.month,book.date.day);
if(book.flag==1)
printf("不能续借!\n");
else
printf("可以续借!\n");
}
printf("1.确认续借 2.取消续借");
scanf("%d",&i);
if(i==1)
{
book.flag=0;
printf("续借日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
scanf("%d/%d/%d",&book.date.year,&book.date.month,&book.date.day);
}
else
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
void menu()
{
int n;
printf("~~~欢迎使用本校图书管理系统~~~\n");
printf("*******************************\n");
printf("1.借书\n");
printf("2.还书\n");
printf("3.图书查询\n");
printf("4.新书上架\n");
printf("5.旧书下架\n");
printf("6.读者查询\n");
printf("7.添加与删除读者\n");
printf("8.续借\n");
printf("9.退出\n");
printf("请选择以上选项:\n");
printf("*******************************\n");
scanf("%d",&n);
switch(n)
{
case 1:borrowbook();break;
case 2:returnbook();break;
case 3:bookinquiry();break;
case 4:bookin();break;
case 5:delbook();break;
case 6:readerinquiry();break;
case 7:readerupdate();break;
case 8:reborrow();break;
case 9:exit(0);break;
default:printf("输入错误,退出\n");exit(0);break;
}
}
void main()
{
int i;
char num;
printf("请输入你的卡号");
scanf("%s",num);
for(i=0;i<5;i++)
if(strcmp(num,card.card_num)==0)
break;
if(i>=5)
{
printf("卡号不存在!");
exit(0);
}
else
menu();
}
本帖最后由 superbe 于 2019-12-24 23:58 编辑
有一点小修改:
void delbook()
{
FILE *fp;
int i, j, m = 0;
char snum; //修改的行(原来是char snum; )
char ch;
if ((fp = fopen("data", "ab+")) == NULL)
{
printf("不能打开文件\n");
return;
}
while (!feof(fp))
if (fread(&book, LEN, 1, fp) == 1)
m++;
fclose(fp);
printf("请输入编号:");
scanf("%s", snum);
for (i = 0; i<5; i++)
if (strcmp(snum, book.book_num) == 0)
{ //修改的行 (添加了{ )
printf("已经找到该记录,是否删除?(y/n)");
break; //修改的行 (添加了break )
} //修改的行 (添加了} )
scanf("%s", ch);
if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)/*判断是否要进行删除*/
{
for (j = i; j<m; j++)
book = book;/*将后一个记录移到前一个记录的位置*/
m--; /*记录的总个数减1*/ //修改的行 (原来是 i--; )
printf("成功删除!\n");
}
if ((fp = fopen("data", "wb")) == NULL)
{
printf("不能打开!\n");
return;
}
for (j = 0; j<m; j++)/*将更改后的记录重新写入指定的磁盘文件中*/
if (fwrite(&book, LEN, 1, fp) != 1)
{
printf("不能保存!\n");
getch();
}
fclose(fp);
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d", &i);
if (i == 1)
menu();
else
exit(0);
} 好的,谢谢!
大神请收下我的膝盖!!!
突然觉得c语言的世界很奇妙
努力学c
加油{:10_256:} {:5_108:}加油 想做一个显示所有信息的函数(show)
不输入数据的话信息显示挺好
如果用bookin函数输入数据的话就乱套了
用delbook删除居然还能再显示(show)函数查到
请问这是咋回事
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define LEN sizeof(struct Book)
#define FORMAT "%-15s%-15s%-15s%-15s\n"
#define DATA card.card_num,card.student_name,book.book_num,book.book_name
struct Card
{
char card_num;
char student_name;
int book_totle;
};
struct Card card={{"20111101","Zhanjun",3},{"20111103","YangKai",1},{"20111113","WuGang",4},{"20111123","Shanglei",2},{"20111105","ZhangKun",5}};
struct Date
{
int year;
int month;
int day;
};
struct Book
{
char book_num;
char book_name;
struct Date date;
int flag;
};
struct Book book={{"305032","History",{0,0,0},1},{"409812","Geogrophy",{0,0,0},1},{"213401","English",{0,0,0},1},{"3287463","Maths",{0,0,0},1},{"4102102","Physicyl",{0,0,0},1}};
char num;
void menu();//函数的声明
void borrowbook();
void returnbook();
void bookinquiry();
void bookin();
void readerinquiry();
void readerin();
void reborrow();
void delbook();
void delreader();
void show();
void borrowbook()
{
int i;
char booknum;
printf("请输入要借阅的书号");
scanf("%s",booknum);
for(i=0;i<5;i++)
{
if(strcmp(booknum,book.book_num)==0)
{
if(book.flag==0)
printf("这本书已经借出!\n");
else
{
book.flag=0;
printf("借出日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
scanf("%d/%d/%d",&book.date.year,&book.date.month,&book.date.day);
break;
}
}
}
for(i=0;i<5;i++)
if(strcmp(num,card.card_num)==0)
{ card.book_totle=card.book_totle+1;
break;
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
void returnbook()
{
int i;
char booknum;
printf("请输入要还的书号");
scanf("%s",booknum);
for(i=0;i<5;i++)
{
if(strcmp(booknum,book.book_num)==0)
{
book.flag=1;
break;
}
if(i>=5)
printf("卡号输入错误!");
for(i=0;i<5;i++)
if(strcmp(num,card.card_num)==0)
{
card.book_totle=card.book_totle+1;
break;
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
}
void bookinquiry()
{
int i;
char booknum;
printf("请输入要查询的书号:");
scanf("%s",booknum);
for(i=0;i<5;i++)
if(strcmp(booknum,book.book_num)==0)
{
printf("编号书名借出日期状态\n");
printf("%s %s",book.book_num,book.book_name);
printf("%4d年%2d月%2d日",book.date.year,book.date.month,book.date.day);
if(book.flag==1)
printf("未借出!\n");
else
printf("已借出!\n");
}
printf("书号不存在\n");
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void bookin()
{
int i,m=0;
char ch;
FILE *fp;
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开文件!\n");
return;
}
while(!feof(fp))
{
if(fread(&book ,LEN,1,fp)==1)
m++;
}
fclose(fp);
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
for(i=0;i<m;i++)
fwrite(&book ,LEN,1,fp);
printf("是否输入?(y/n):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
{
printf("图书编号:");
scanf("%s",book.book_num);
for(i=0;i<m;i++)
if (strcmp(book.book_num, book.book_num) == 0)
{
printf("该记录已经存在\n");
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
printf("书名:");
scanf("%s",book.book_name);
if(fwrite(&book,LEN,1,fp)!=1)
{
printf("不能保存!");
getch();
}
else
{
printf("%s 已经保存!\n",book.book_name);
m++;
}
printf("是否继续?(y/n):");
scanf("%s",ch);
}
fclose(fp);
printf("OK!\n");
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void delbook()
{
FILE *fp;
int i, j, m = 0;
char snum;
char ch;
if ((fp = fopen("data", "ab+")) == NULL)
{
printf("不能打开文件\n");
return;
}
while (!feof(fp))
if (fread(&book, LEN, 1, fp) == 1)
m++;
fclose(fp);
printf("请输入编号:");
scanf("%s", snum);
for (i = 0; i<5; i++)
if (strcmp(snum, book.book_num) == 0)
{
printf("已经找到该记录,是否删除?(y/n)");
break;
}
scanf("%s", ch);
if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
{
for (j = i; j<m; j++)
book = book;
m--;
printf("成功删除!\n");
}
if ((fp = fopen("data", "wb")) == NULL)
{
printf("不能打开!\n");
return;
}
for (j = 0; j<m; j++)
if (fwrite(&book, LEN, 1, fp) != 1)
{
printf("不能保存!\n");
getch();
}
fclose(fp);
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d", &i);
if (i == 1)
menu();
else
exit(0);
}
void readerinquiry()
{
int i;
char studentname;
printf("请输入要查询的读者");
scanf("%s",studentname);
for(i=0;i<5;i++)
if(strcmp(studentname,card.student_name)==0)
{
printf("借书证号姓名书名借出日期\n");
printf("%s %s %s",card.card_num,card.student_name,book.book_name);
printf("%4d年%2d月%2d日\n",book.date.year,book.date.month,book.date.day);
}
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
void readerin()
{
int i,m=0;
char ch;
FILE *fp;
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开文件!\n");
return;
}
while(!feof(fp))
{
if(fread(&card ,LEN,1,fp)==1)
m++;
}
fclose(fp);
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
for(i=0;i<m;i++)
fwrite(&card ,LEN,1,fp);
printf("是否输入?(y/n):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
{
printf("学号:");
scanf("%s",card.card_num);
for(i=0;i<m;i++)
if (strcmp(card.card_num, card.card_num) == 0)
{
printf("该记录已经存在\n");
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
printf("姓名:");
scanf("%s",card.student_name);
if(fwrite(&card,LEN,1,fp)!=1)
{
printf("不能保存!");
getch();
}
else
{
printf("%s 已经保存!\n",card.student_name);
m++;
}
printf("是否继续?(y/n):");
scanf("%s",ch);
}
fclose(fp);
printf("OK!\n");
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void delreader()
{
FILE *fp;
int i, j, m = 0;
char num;
char ch;
if ((fp = fopen("data", "ab+")) == NULL)
{
printf("不能打开文件\n");
return;
}
while (!feof(fp))
if (fread(&card, LEN, 1, fp) == 1)
m++;
fclose(fp);
printf("请输入编号:");
scanf("%s", num);
for (i = 0; i<5; i++)
if (strcmp(num, card.card_num) == 0)
{
printf("已经找到该记录,是否删除?(y/n)");
break;
}
scanf("%s", ch);
if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
{
for (j = i; j<m; j++)
card = card;
m--;
printf("成功删除!\n");
}
if ((fp = fopen("data", "wb")) == NULL)
{
printf("不能打开!\n");
return;
}
fclose(fp);
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d", &i);
if (i == 1)
menu();
else
exit(0);
}
void reborrow()
{
int i;
char booknum;
printf("请输入要续借的书号");
scanf("%s",booknum);
for(i=0;i<5;i++)
if(strcmp(booknum,book.book_num)==0)
{
printf("编号书名借出日期状态\n");
printf("%s %s",book.book_num,book.book_name);
printf("%4d年%2d月%2d日",book.date.year,book.date.month,book.date.day);
if(book.flag==1)
printf("不能续借!\n");
else
printf("可以续借!\n");
}
printf("1.确认续借 2.取消续借");
scanf("%d",&i);
if(i==1)
{
book.flag=0;
printf("续借日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
scanf("%d/%d/%d",&book.date.year,&book.date.month,&book.date.day);
}
else
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)menu();
else exit(0);
}
void show()
{
int i;
printf("学号 姓名 书号 书名\t\n");
for(i=0;i<10;i++)
printf(FORMAT,DATA);
printf("1.确认并返回菜单 2.确认信息并退出\n");
scanf("%d",&i);
if(i==1)
menu();
else
exit(0);
}
void menu()
{
int n;
printf("~~~欢迎使用本校图书管理系统~~~\n");
printf("*******************************\n");
printf("1.借书\n");
printf("2.还书\n");
printf("3.图书查询\n");
printf("4.新书上架\n");
printf("5.旧书下架\n");
printf("6.读者查询\n");
printf("7.添加读者\n");
printf("8.删除读者\n");
printf("9.续借\n");
printf("10.显示\n");
printf("11.退出\n");
printf("请选择以上选项:\n");
printf("*******************************\n");
scanf("%d",&n);
switch(n)
{
case 1:borrowbook();break;
case 2:returnbook();break;
case 3:bookinquiry();break;
case 4:bookin();break;
case 5:delbook();break;
case 6:readerinquiry();break;
case 7:readerin();break;
case 8:delreader();break;
case 9:reborrow();break;
case 10:show();break;
case 11:exit(0);break;
default:printf("输入错误,退出\n");exit(0);break;
}
}
void main()
{
int i;
char num;
printf("请输入你的卡号");
scanf("%s",num);
for(i=0;i<5;i++)
if(strcmp(num,card.card_num)==0)
break;
if(i>=5)
{
printf("卡号不存在!");
exit(0);
}
else
menu();
}
本帖最后由 superbe 于 2019-12-27 22:36 编辑
可能是data文件和数组数据不一致导致的,实际上并没有从数组中删除掉。
例如data文件为空,delBook()函数里
if (fread(&book, LEN, 1, fp) == 1)
m++;
读取不成功,m值为0,所以
for (j = i; j<m; j++)
book = book;
j<m不成立,没有执行。
这是书上的一个程序可以参考,和你的需求有点类似。这个代码开始就从文件中读取数据,如果文件为空就输入新数据,并保存到文件。以后每次读取文件都是最新数据,输入的新数据会追加到文件末尾,数组数据和文件是保持一致的。
/* booksave.c -- 在文件中保存结构的内容 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXTITL40
#define MAXAUTL40
#define MAXBKS 10 /* 最大书籍数量 */
char * s_gets(char * st, int n);
struct book { /* book结构*/
char title;
char author;
float value;
};
int main(void)
{
struct book library; /* 结构数组*/
int count = 0;
int index, filecount;
FILE * pbooks;
int size = sizeof (struct book);
if ((pbooks = fopen("book.dat", "a+b")) == NULL)
{
fputs("Can't open book.dat file\n",stderr);
exit(1);
}
rewind(pbooks); /* 定位到文件开始*/
while (count < MAXBKS &&fread(&library, size,
1, pbooks) == 1)
{
if (count == 0)
puts("Current contents of book.dat:");
printf("%s by %s: $%.2f\n",library.title,
library.author, library.value);
count++;
}
filecount = count;
if (count == MAXBKS)
{
fputs("The book.dat file is full.", stderr);
exit(2);
}
puts("Please add new book titles.");
puts("Press at the start of a line to stop.");
while (count < MAXBKS && s_gets(library.title, MAXTITL) != NULL
&& library.title != '\0')
{
puts("Now enter the author.");
s_gets(library.author, MAXAUTL);
puts("Now enter the value.");
scanf("%f", &library.value);
while (getchar() != '\n')
continue; /* 清理输入行*/
if (count < MAXBKS)
puts("Enter the next title.");
}
if (count > 0)
{
puts("Here is the list of your books:");
for (index = 0; index < count; index++)
printf("%s by %s: $%.2f\n",library.title,
library.author, library.value);
fwrite(&library, size, count - filecount,
pbooks);
}
else
puts("No books? Too bad.\n");
puts("Bye.\n");
fclose(pbooks);
return 0;
}
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)
{
find = strchr(st, '\n'); // look for newline
if (find) // if the address is not NULL,
*find = '\0'; // place a null character there
else
while (getchar() != '\n')
continue; // dispose of rest of line
}
return ret_val;
}
页:
[1]