#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(book)
#include<string.h>
#include <windows.h>
static int total; //记录文件保存书的信息的结构体的个数
typedef struct book //定义保存书信息的结构体
{
int num;
char bookname[100];
char writer[50];
char fenlei[10];
char publisher[50];
char time[20];
float price;
int store;
} book;
typedef struct admin //定义保存管理员帐号密码的结构体
{
char account[10];
char password[12];
}admin;
int member() //管理员登录
{
char account[12];
char password[12];
admin m;
FILE *fp;
if ((fp=fopen("member","rb+"))==NULL)
{
system("color 0C");
printf("\n\t\t\t读取不到管理员信息") ;
system("color 0C");
printf("\n请输入要建立管理员帐号(不超过10个字符):");
scanf("%s",m.account);
printf("\n请输入帐号密码(不超过12个字符):");
scanf("%s",m.password);
fp=fopen("member","ab+");
fwrite(&m,sizeof(admin),1,fp);
fclose(fp);
fflush(stdin);
}
fseek(fp,0,SEEK_SET);
fread(&m,sizeof(admin),1,fp);
do{
printf(" ━━━━━━━━━━━━━━━━━━━━━━━\n");
printf("\t\t\t\t管理员登录\n");
printf(" 请输入管理员帐号:");
scanf("%s",account);
printf(" 请输入密码:");
scanf("%s",password);
}while((strcmp(m.account,account)!=0)||(strcmp(m.password,password)!=0)) ;
system("cls");
fclose(fp);
fflush(stdin);
return 0;
}
int add_book() //添加图书
{
FILE *fp;
book b,b1;
fp=fopen("data.dat","ab+");
printf(" \n\t\t\t请输入图书登录号: ");
scanf(" \n%d",&b.num);
fseek(fp,0,SEEK_SET);
while (fread(&b1,LEN,1,fp))
{
if(b1.num==b.num)
{ fclose(fp);
printf("\n书库中已有同登录号的书籍,无法加入");
Sleep(2000);
system("cls");return 0;
}
}
printf(" \n\t\t\t请输入图书书名: ");
scanf(" %s",b.bookname);
fseek(fp,0,SEEK_SET);
while (fread(&b1,LEN,1,fp))
{
if(strcmp(b.bookname,b1.bookname)==0)
{ fclose(fp);
printf("\n书库中已有同名的书籍,无法加入");
Sleep(2000);
system("cls");return 0;
}
}
printf(" \n\t\t\t请输入图书作者名: ");
scanf("%s",b.writer);
printf(" \n\t\t\t请输入图书出版单位: ");
scanf("%s",b.publisher);
printf(" \n\t\t\t请输入图书出版时间 : ");
scanf("%s",b.time);
printf(" \n \t\t\t请输入图书分类 : ");
scanf("%s",b.fenlei);
printf(" \n\t\t\t请输入图书价单 : ");
scanf("%f",&b.price);
printf(" \n\t\t\t请输入图书入库数量 : ");
scanf("%d",&b.store);
fseek(fp,0,SEEK_END);
fwrite(&b,sizeof(book),1,fp);
fclose(fp);
printf("\t\t\t add ok!\n");
total=total+1;
}
void display() //展示所有图书
{
book b;
FILE *fp;
fp=fopen("data.dat","rb");
fseek(fp,0,SEEK_SET);
fread(&b,sizeof(book),1,fp);
printf("┏━━━┳━━━┳━━━━┳━━━━━┳━━━━━┳━━━┳━━━━┳━━━┓\n");
printf("┃登录号┃ 书名 ┃ 作 者┃ 出版单位 ┃ 出版时间 ┃分类号┃ 单价 ┃ 库存 ┃ \n");
printf("┣━━━╋━━━╋━━━━╋━━━━━╋━━━━━╋━━━╋━━━━╋━━━┫ \n");
while(!feof(fp))
{
printf( "┃%-6.d┃%-6s┃%-8s┃%-10.10s┃%-10s┃%-6s┃%.3f ┃%1.d ┃\n",b.num,b.bookname,b.writer,b.publisher,b.time,b.fenlei,b.price,b.store);
fread(&b,sizeof(book),1,fp);
}
fclose(fp);
printf("┗━━━┻━━━┻━━━━┻━━━━━┻━━━━━┻━━━┻━━━━┻━━━┛\n");
}
void search() //查询图书
{ book b;int flag,a;char ch; // flag用来判断文件有无查询的书
char writer[50],bookname[100];
FILE *fp;
fp=fopen("data.dat","rb");
if((fp=fopen("data.dat","r"))==NULL)
{
printf("\t\t\t错误,请先添加图书!\n");
return ;
}
fseek(fp,0,SEEK_SET);
ch=fgetc(fp);
if(ch==EOF)
{printf("\t\t\t书库中没信息!");
return;
}
printf("\n请选择,1为按书名查询,2为按作者查询:");
scanf("%d",&a);
switch (a)
{
case 1:
{
printf("\n\t\t请输入图书名:");
scanf("%s",&bookname);
fp=fopen("data.dat","rb");
fseek(fp,0,SEEK_SET);
flag=0;
while (fread(&b,LEN,1,fp)) //遍历文件所有结构体
{
if( strcmp(bookname,b.bookname)==0)
{
printf("┏━━━┳━━━┳━━━━┳━━━━━┳━━━━━┳━━━┳━━━━┳━━━┓\n");
printf("┃登录号┃ 书名 ┃ 作 者┃ 出版单位 ┃ 出版时间 ┃分类号┃ 单价 ┃ 库存 ┃ \n");
printf("┣━━━╋━━━╋━━━━╋━━━━━╋━━━━━╋━━━╋━━━━╋━━━┫ \n");
printf( "┃%-6.d┃%-6s┃%-8s┃%-10.10s┃%-10s┃%-6s┃%.3f ┃%1.d ┃\n",b.num,b.bookname,b.writer,b.publisher,b.time,b.fenlei,b.price,b.store);
printf("┗━━━┻━━━┻━━━━┻━━━━━┻━━━━━┻━━━┻━━━━┻━━━┛\n");
flag=1;
}
}
if(flag==0)
printf("\n在书库中找不到!");
Sleep(2000);
system("cls");
}
break;
case 2:
{
printf("\n\t\t请输入图书作者:");
scanf("%s",&writer);
fp=fopen("data.dat","rb");
fseek(fp,0,SEEK_SET);
while (fread(&b,LEN,1,fp)) //遍历文件所有结构体
{
if( strcmp(writer,b.writer)==0 )
{
printf("┏━━━┳━━━┳━━━━┳━━━━━┳━━━━━┳━━━┳━━━━┳━━━┓\n");
printf("┃登录号┃ 书名 ┃ 作 者┃ 出版单位 ┃ 出版时间 ┃分类号┃ 单价 ┃ 库存 ┃ \n");
printf("┣━━━╋━━━╋━━━━╋━━━━━╋━━━━━╋━━━╋━━━━╋━━━┫ \n");
printf( "┃%-6.d┃%-6s┃%-8s┃%-10.10s┃%-10s┃%-6s┃%.3f ┃%1.d ┃\n",b.num,b.bookname,b.writer,b.publisher,b.time,b.fenlei,b.price,b.store);
printf("┗━━━┻━━━┻━━━━┻━━━━━┻━━━━━┻━━━┻━━━━┻━━━┛\n");
flag=1;
Sleep(2000);
system("cls");
}
}
if(flag==0)
printf("\n在书库中找不到!");
Sleep(2000);
system("cls");
}
break;
default:{
printf("\n\t\t\t输入错误") ;
Sleep(2000);
system("cls");
}
break;
fclose(fp);
}
}
void del()
{
book b,b1;
int flag=0,i=0; //flag用于判断书是否存在
book temp[total];
FILE *fp,*fp1;
int a;
if ((fp=fopen("data.dat","rb+"))==NULL)
{
printf("打开文件错误!!!\n");
Sleep(1000);
exit(1);
}
printf("\n请输入登录号:");
scanf("%d",&a);
system("cls");
fseek(fp,0,SEEK_SET);
while (fread(&b,LEN,1,fp)) //遍历文件所有结构体
{
if(a==b.num)
flag=1; //判断有无此书
}
if(flag==0) //没有此书退出函数
{
printf("\n\t\t\t没这书");
Sleep(2000);
system("cls");
return;
}
fseek(fp,0,SEEK_SET);
while((!feof(fp))&&(i<total))
{
fread(&b,sizeof(book),1,fp); //将除了要删除的信息之外的所有信息保存进结构体 book temp[total],写进内存
if (b.num!=a)
{
temp[i]=b;
i=i+1;
}
}
fclose(fp);
fp1=fopen("data.dat","wb");
fclose(fp1);
fp1=fopen("data.dat","ab"); //以覆盖原有的文件信息 的方式建立同名文件
for(i=0;i<total-1;i++) //将 除了要删除的信息之外的所有信息保存进的结构体 book temp[total]赋值给b1,写入文件
{ b1=temp[i];
fseek(fp1,0,SEEK_END);
fwrite(&b1,sizeof(book),1,fp1);
}
fclose(fp1);
total=total-1;
}
void change() //修改图书信息
{
book b,b1;
FILE *fp;
int a;
if ((fp=fopen("data.dat","rb+"))==NULL)
{
printf("打开文件错误!!!\n");
Sleep(1000);
exit(1);
}
printf("请输入图书登录号\n");
scanf("%d",&a);
system("cls");
fseek(fp,0,SEEK_SET);
while (fread(&b,LEN,1,fp)) //遍历文件所有结构体
{
if (b.num==a)
{
printf(" \n\t\t\t请重新输入图书登录号: ");
scanf(" \n%d",&b.num);
printf(" \n\t\t\t请重新输入图书书名: ");
scanf(" %s",b.bookname);
printf(" \n\t\t\t请重新输入图书作者名: ");
scanf("%s",b.writer);
printf(" \n\t\t\t请重新输入图书出版单位: ");
scanf("%s",b.publisher);
printf(" \n\t\t\t请重新输入图书出版时间 : ");
scanf("%s",b.time);
printf(" \n \t\t\t请重新输入图书分类 : ");
scanf("%s",b.fenlei);
printf(" \n\t\t\t请重新输入图书价单 : ");
scanf("%f",&b.price);
printf(" \n\t\t\t请重新输入图书入库数量 : ");
scanf("%d",&b.store);
fseek(fp,-LEN,SEEK_CUR); /*位置指针移动到该数据块首位*/
fwrite(&b,LEN,1,fp);
fclose(fp);
break;
}
if (feof(fp))
{
printf("no this book\n");
}
}
}
void initi() //对total进行读取
{
FILE *fp;
fp=fopen("total.dat","rb+");
if(fp==NULL) //没有保存total的文件则创建且total为0
{
total=0;
fp=fopen("total.dat","wb");
fwrite(&total,sizeof(int),1,fp);
fclose(fp);
}
else //有保存total的文件则读取
{
fread(&total,sizeof(int),1,fp);
fclose(fp);
}
}
void total_save() //将total保存进文件
{
FILE *fp;
fp=fopen("total.dat","wb");
fwrite(&total,sizeof(int),1,fp);
}
void end()
{
printf("\n\n\n\n ▍ ★∴\n");
printf(" ....▍▍....█▍ ☆ ★∵ ..../\n");
printf(" ◥█▅▅██▅▅██▅▅▅▅▅███◤ \n");
printf(" .◥███████████████◤\n");
printf(" ~~~~◥█████████████◤~~~~\n\n");
printf(" ━━━━━━━━ 感谢使用图书管理系统 ━━━━━━━━\n");
system("color 0C");
Sleep(200);
system("color 0B");
Sleep(200);
system("color 09");
Sleep(200);
system("color 06");
Sleep(200);
printf("\n\n 任意键退出\n");
}
void borrow() // 借书
{
int num,flag=0; // flag用来判断文件有无此书 ,有则为1
FILE *fp;
book b,b1;
fp=fopen("data.dat","rb+");
printf(" \n\t\t\t请输入图书登录号: ");
scanf(" \n%d",&num);
fseek(fp,0,SEEK_SET);
while (fread(&b,LEN,1,fp)) //遍历文件所有结构体
{
if(num==b.num)
{
flag=1;
printf("┏━━━┳━━━┳━━━━┳━━━━━┳━━━━━┳━━━┳━━━━┳━━━┓\n");
printf("┃登录号┃ 书名 ┃ 作 者┃ 出版单位 ┃ 出版时间 ┃分类号┃ 单价 ┃ 库存 ┃ \n");
printf("┣━━━╋━━━╋━━━━╋━━━━━╋━━━━━╋━━━╋━━━━╋━━━┫ \n");
printf( "┃%-6.d┃%-6s┃%-8s┃%-10.10s┃%-10s┃%-6s┃%.3f ┃%1.d ┃\n",b.num,b.bookname,b.writer,b.publisher,b.time,b.fenlei,b.price,b.store);
printf("┗━━━┻━━━┻━━━━┻━━━━━┻━━━━━┻━━━┻━━━━┻━━━┛\n");
if(b.store==0) //判断库存是否为0
{
printf("\n\t\t\t此书库存为0,无法出借");
Sleep(2000);
system("cls"); fclose(fp);
return;
}
else
{
b.store=b.store-1;
fseek(fp,-LEN,SEEK_CUR); /*位置指针移动到该数据块首位*/
fwrite(&b,LEN,1,fp); //修改后将结构体b替换原结构体信息
fclose(fp);
printf("\n\t\t\t借书成功");
Sleep(2000);
system("cls");
return;
}
}
}
if(flag==0)
{
printf("\n\t\t\t书库中没这本书");
Sleep(2000);
system("cls");
}
}
void return_book()
{
int num,flag=0;
FILE *fp;
book b,b1;
fp=fopen("data.dat","rb+");
printf(" \n\t\t\t请输入要还图书的登录号: ");
scanf(" \n%d",&num);
fseek(fp,0,SEEK_SET);
while (fread(&b,LEN,1,fp)) //遍历文件所有结构体
{
if(num==b.num)
{
flag=1;
b.store=b.store+1;
fseek(fp,-LEN,SEEK_CUR); /*位置指针移动到该数据块首位*/
fwrite(&b,LEN,1,fp);
fclose(fp);
printf("\n\t\t\t还书成功");
Sleep(2000);
system("cls");
return;
}
}
if(flag==0)
{
printf("\n\t\t\t书库中没这本书");
Sleep(2000);
system("cls");
}
}
int main()
{
initi();
member();
//在txt文档里显示较为正常,但在其他地方就成下面对不齐的样子
for(;;)
{ system("color 0B");
int a;
printf(" ┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n");
printf(" ┃ ┃ 图书管理系统 ┃ ┃\n");
printf(" ┃ ┗━━━━━━━━━━━━━━━━━━━┛ ┃\n");
printf(" ┃ ●[1]图书信息录入 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ ●[2]图书信息浏览 |\n");
printf(" ┃ ┃\n");
printf(" ┃ ●[3]图书信息查询 |┃\n");
printf(" ┃ ┃\n");
printf(" ┃ ●[4]图书信息修改 |\n");
printf(" ┃ ┃\n");
printf(" ┃ ●[5]图书信息删除 | \n");
printf(" ┃ |\n");
printf(" ┃ ●[6]借书 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ ●[7]还书 ┃\n");
printf(" ┃ |\n");
printf(" ┃ ●[8]退出系统 |\n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf(" 请选择:");
fflush(stdin);
scanf("%d",&a);
switch (a)
{
case 1:
{
add_book();
total_save();
}
break;
case 2: display();break;
case 3: search();break;
case 4: change();break;
case 5: del();break;
case 6: borrow();break;
case 7: return_book();break;
case 8:
{
end() ;
getch();
return 0;
}break;
}
}
}
需要注意的是,这个课程设计实现删除的方法,是通过创建另外一个文件来保存原文件里除了要删除信息之外的所有信息的方式。