目录

  • C语言图书管理系统 文件数据库
    • 简介
    • 题目要求
    • 实现的功能
    • readme
    • 代码

C语言图书管理系统 文件数据库

简介

c语言的一个大作业,发上来纪念下嘿嘿。写的不是很好,很多东西都揉在一起来,不过注释写的也挺多,希望能帮到有需要的朋友。

题目要求

简单文件数据库-模拟图书馆管理系统
涉及知识点:文件读写、内存管理、结构体定义、基本数据结构、高级格式化输入输出
要求:
编写一个程序模拟图书管理系统。用户分为管理员和读者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择。读者菜单包括借书、还书、查询等功能。管理员菜单包括图书和读者信息录入、修改和删除。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走。
命令行参数如下:
Libsim –a(-u) xxxx
第一个参数为可执行程序名称;第二个参数为用户身份,-a表示管理员,-u表示读者;第三个参数为用户名

实现的功能

1. 管理员:

  • 对图书进行管理:添加图书,修改图书名称、数量,删除图书。
  • 对读者进行管理:添加读者,修改读者名称,删除读者.
  • 一键查看全部书籍信息(序号,书名,剩余数量)
  • 一键查看全部读者信息(序号,读者名,所借阅书籍)
  • 单本图书详情查询:可根据序号和书名查找,向管理员展示图书序号、名称、剩余数量和借阅了此书的读者。

2. 读者:

  • 借阅图书(只能同时借阅一本书)
  • 还回图书
  • 一键查看全部书籍信息(序号,书名,剩余数量)

readme

需要从cmd命令行运行程序,如图(注意格式)

管理员名:Zhang
进入管理员菜单格式:可执行程序名 -a Zhang (只设置了一个管理员,没有添加管理员的功能)
进入读者菜单格式:可执行程序名 -u 读者名 (需要先通过管理员添加读者)

默认生成的文件放在d盘根目录下(有时中间的过渡文件可能会没有被删除)

  • Book.txt :存放书籍信息
  • Users.txt :存放读者信息

代码

#include<stdio.h>
#include <io.h>int bookNumber = 1;  //全局变量 表示图书的序号
int usersNumber = 1;  //表示读者编号
char enter;  //接收换行符//添加图书的函数
void addBook(FILE *Book)
{FILE *Book1;  //当文件和书本都存在时需要新建文件来更改信息int judgeName = 0;  //判断此书是否已经被存放int num = 1, readNum, readNumber;  //书本的数量  存放读到的书本数量  读到的书本序号char name[20] = {0}, readName[20] = {0};  //存放图书名字  暂时存放读到的字符串名printf("请输入要添加的图书名:");for(int i = 0; i<20; i++)  //从输入流取得需要添加的书本名字{if(i==0)scanf("%c%c", &enter,&name[i]);elsescanf("%c",&name[i]);if(name[i]==10)  //将最后的换行符改为空{name[i]=0;break;}}  if(access("d:/Book.txt",F_OK)==0)  //access函数判断文件是否存在,存在返回值为0 使用的头文件为io{judgeName = 1;FILE *judge = fopen("d:/Book.txt", "r");  //读取数据文件,查找是否已经存在此书while(!feof(judge)){fscanf(judge, "%d %s %d", &readNumber, readName, &readNum); //由于readName已经表示地址,不需要取地址符fscanf(judge,"\n");  //读入换行符,准备下一行的读取if(strcmp(name, readName)==0)  //发现已经存在此书后跳出循环{judgeName = 2;  //为2时表示已经存在此书,需要新建一个文件来更改信息break;}}fclose(judge);  //关闭用于判断而打开的文件bookNumber = readNumber+1;if(judgeName==1)Book = fopen("d:/Book.txt", "a");  //文件存在 且不存在相同书名时向后追加内容else if(judgeName==2){Book1 = fopen("d:/Book1.txt", "w");  //新建一个文件暂存Book中的信息,最后再返回源文件中Book = fopen("d:/Book.txt","r");  //只读打开原本的文件}}elseBook = fopen("d:/Book.txt","w");  //文件不存在时新建一个文件if (judgeName<2){  fprintf(Book, "%d %s %d\n", bookNumber, name, num);  //写入序号 书名 数量和换行符bookNumber++; fclose(Book);}else{while(!feof(Book)){fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum);if(strcmp(name, readName)==0)fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum+1);  //写入序号 书名 数量+1和换行符elsefprintf(Book1, "%d %s %d\n", readNumber, readName, readNum);  //写入序号 书名 数量和换行符            }bookNumber++;fclose(Book);  //关闭文件fclose(Book1);Book1 = fopen("d:/Book1.txt", "r");Book = fopen("d:/Book.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Book1)){fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum);fprintf(Book, "%d %s %d\n", readNumber, readName, readNum);}fclose(Book);fclose(Book1);remove("d:/Book1.txt");  //删除原文件              //rename("d:/Book1.txt", "d:/Book.txt");  //将更改后的文件改名为原数据文件}printf("添加成功!\n");
}//修改图书信息函数
void changeBook(FILE *Book)
{while(1){char name[20] = {0}, readName[20] = {0};printf("           Edit Book Information            \n");printf("[------------------------------------------]\n");printf("\t请选择需要修改的信息:\n  1.修改图书名称\n  2.修改图书数量\n  3.返回主菜单\n");printf("[------------------------------------------]\n");int function, readNumber, readNum, find = 0;  //功能选择 读取到的序号 读取到的数量 是否找到此书//判断修改后的书名是否和原有的重复Book = fopen("d:/Book.txt","r");  //只读打开原文件int ifNumber, ifNum;char ifName[20] = {0};FILE *ifUserExisted = fopen("d:/Users1.txt","w");while(!feof(Book)){fscanf(Book, "%d %s %d\n", &ifNumber, ifName, &ifNum);fprintf(ifUserExisted, "%d %s %d\n", &ifNumber, ifName, ifNum);  }fclose(ifUserExisted);fclose(Book);scanf("%d",&function);if(function == 3){remove("d:/Book1.txt");  //有时会多余创造了文件,需要删除 return;}Book = fopen("d:/Book.txt","r");  //只读打开原文件FILE *Book1 = fopen("d:/Book1.txt", "w");  //先新建一个文件存储更改后的信息printf("请输入需要更改的图书名:");for(int i = 0; i<20; i++)  //从输入流取得需要添加的书本名字{if(i==0)scanf("%c%c", &enter,&name[i]);elsescanf("%c",&name[i]);if(name[i]==10)  //将最后的换行符改为空{name[i]=0;break;}}if(function==1){while(!feof(Book)){fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum);if(strcmp(name, readName)==0){  find = 1;  //找到了此书printf("您要将书名%s更改为:", name);char changeName[20] = {0};for(int i = 0; i<20; i++)  //从输入流取得需要更改的书本名字{if(i==0)scanf("%c",&changeName[i]);elsescanf("%c",&changeName[i]);if(changeName[i]==10)  //将最后的换行符改为空{changeName[i]=0;break;}}ifUserExisted = fopen("d:/Users1.txt","r");   //判断更改后的名字是否会和已存在的书名冲突while(!feof(ifUserExisted)){fscanf(ifUserExisted, "%d %s %d\n", &ifNumber, ifName, &ifNum);if (strcmp(changeName, ifName)==0){printf("更改失败:已存在名称为%s的图书\n", changeName);fclose(ifUserExisted);fclose(Book);  //关闭文件fclose(Book1);return;}}fprintf(Book1, "%d %s %d\n", readNumber, changeName, readNum);  //写入序号 更改后的书名 数量和换行符}elsefprintf(Book1, "%d %s %d\n", readNumber, readName, readNum);  //写入序号 书名 数量和换行符            }if(find==0)  //若没找到此书{printf("没有找到此书!请重新输入\n");break;}fclose(Book);  //关闭文件fclose(Book1);Book1 = fopen("d:/Book1.txt", "r");Book = fopen("d:/Book.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Book1)){fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum);fprintf(Book, "%d %s %d\n", readNumber, readName, readNum);}fclose(Book);fclose(Book1);remove("d:/Book1.txt");  //删除原文件              //rename("d:/Book1.txt", "d:/Book.txt");  //将更改后的文件改名为原数据文件  此方法成功率低!!!printf("更改成功!\n");}else if(function == 2){while(!feof(Book)){fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum);if(strcmp(name, readName)==0){  find = 1;  //找到了此书printf("您要将数量%d更改为:", readNum);int newNum = 0;scanf("%d",&newNum);fprintf(Book1, "%d %s %d\n", readNumber, readName, newNum);  //写入序号 书名 更改后的数量和换行符}elsefprintf(Book1, "%d %s %d\n", readNumber, readName, readNum);  //写入序号 书名 数量和换行符            }if(find==0)  //若没找到此书{printf("没有找到此书!请重新输入");break;}fclose(Book);  //关闭文件fclose(Book1);Book1 = fopen("d:/Book1.txt", "r");Book = fopen("d:/Book.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Book1)){fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum);fprintf(Book, "%d %s %d\n", readNumber, readName, readNum);}fclose(Book);fclose(Book1);remove("d:/Book1.txt");  //删除原文件              //rename("d:/Book1.txt", "d:/Book.txt");  //将更改后的文件改名为原数据文件  此方法易出现问题!!!printf("更改成功!\n");}else{printf("输入格式有误,请重新输入!");break;}}
}//删除书籍的函数
void delBook(FILE *Book)
{while(1){printf("请输入您想删除的图书名:(输入\"-r\"返回上一级)");char delName[20] = {0};for(int i = 0; i<20; i++)  //从输入流取得需要删除的书本名字{//if(i==0)//  scanf("%c%c", &enter,&delName[i]);//elsescanf("%c",&delName[i]);if(delName[i]==10)  //将最后的换行符改为空{delName[i]=0;break;}}if(strcmp(delName, "-r")==0)  //输入返回上一级的指示后返回return;int readNumber, readNum, find = 0;char readName[20] = {0};Book = fopen("d:/Book.txt","r");FILE *Book1 = fopen("d:/Book1.txt","w");while (!feof(Book)){fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum);if(strcmp(delName, readName)==0){  find = 1;  //找到了此书//因为要删除此条信息,所以不再向新文件中输出它}else{if(find==1)fprintf(Book1, "%d %s %d\n", readNumber-1, readName, readNum);  //排在删除后的写入-1的序号 书名 数量和换行符            elsefprintf(Book1, "%d %s %d\n", readNumber, readName, readNum);  //删除前的写入的序号 书名 数量和换行符            }            }if(find==0)  //若没找到此书{printf("没有找到此书!请重新输入\n");continue;}fclose(Book);fclose(Book1);Book1 = fopen("d:/Book1.txt", "r");Book = fopen("d:/Book.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Book1)){fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum);fprintf(Book, "%d %s %d\n", readNumber, readName, readNum);}fclose(Book);fclose(Book1);remove("d:/Book1.txt");  //删除原文件              printf("删除成功!\n");}
}//展示全部图书的函数
void showBook(FILE *Book)
{printf("                  Library                   \n");printf("[------------------------------------------]\n");printf("\t序号\t书名\t\t数量\n");char readName[20] = {0};int readNumber, readNum;Book = fopen("d:/Book.txt", "r");while(!feof(Book)){fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum);printf("\t%d\t%s\t\t%d\n",readNumber, readName, readNum);           }fclose(Book);printf("[------------------------------------------]\n");
}//向管理员展示全部用户的函数
void showUsers(FILE *Users)
{printf("                   Users                    \n");printf("[------------------------------------------]\n");printf("\t序号\t姓名\t所借阅图书\n");char readName[20] = {0}, borrowBook[20] = {0};int readNumber;Users = fopen("d:/Users.txt", "r");while(!feof(Users)){fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook);printf("\t%d\t%s\t%s\n",readNumber, readName, borrowBook);           }fclose(Users);printf("[------------------------------------------]\n");
}//添加用户函数
void addUsers(FILE *Users)
{FILE *Users1;  //当文件和用户都存在时需要新建文件来更改信息int judgeName = 0;  //判断此用户是否已经存在int num = 1, readNumber;  //  存放读到的书本数量  读到的用户序号char name[20] = {0}, readName[20] = {0}, borrowBook[20] = {"None"},readBorrowBook[20] = {"None"};  //存放用户名字  暂时存放读到的字符串名printf("请输入要添加的用户名:");for(int i = 0; i<20; i++)  //从输入流取得需要添加的用户名{if(i==0)scanf("%c%c", &enter,&name[i]);elsescanf("%c",&name[i]);if(name[i]==10)  //将最后的换行符改为空{name[i]=0;break;}}  if(access("d:/Users.txt",F_OK)==0)  //access函数判断文件是否存在,存在返回值为0 使用的头文件为io{ judgeName = 1;FILE *judge = fopen("d:/Users.txt", "r");  //读取数据文件,查找是否已经存在此用户while(!feof(judge)){fscanf(judge, "%d %s %s", &readNumber, readName, readBorrowBook); //由于readName已经表示地址,不需要取地址符fscanf(judge,"\n");  //读入换行符,准备下一行的读取if(strcmp(name, readName)==0)  //发现已经存在此用户后跳出循环{printf("已经存在此用户,无法添加。");  //已经存在此用户,返回return;}}fclose(judge);  //关闭用于判断而打开的文件usersNumber = readNumber+1;if(judgeName==1)Users = fopen("d:/Users.txt", "a");  //文件存在 且不存在相同用户时向后追加内容}elseUsers = fopen("d:/Users.txt","w");  //文件不存在时新建一个文件fprintf(Users, "%d %s %s\n", usersNumber, name, borrowBook);  //写入序号 用户名 所借书和换行符usersNumber++; fclose(Users);printf("添加成功!\n");
}//修改读者信息函数
void changeUsers(FILE *Users)
{while(1){char name[20] = {0}, readName[20] = {0}, borrowBook[20] = {"None"};printf("              Edit Reader Name              \n");printf("[------------------------------------------]\n");printf("\t请选择需要修改的信息:\n  1.修改读者名称\n  2.返回主菜单\n");printf("[------------------------------------------]\n");int function, readNumber, find = 0;  //功能选择 读取到的序号  是否找到此书Users = fopen("d:/Users.txt","r");  //只读打开原文件  //此处创建ifUserExisted,一会用于查找是否存在相同的名字int ifNumber;char ifName[20] = {0}, ifBorrow[20] = {0};FILE *ifUserExisted = fopen("d:/Book1.txt","w");while(!feof(Users)){fscanf(Users, "%d %s %s\n", &ifNumber, ifName, ifBorrow);fprintf(ifUserExisted, "%d %s %s\n", &ifNumber, ifName, ifBorrow);  }fclose(ifUserExisted);fclose(Users);Users = fopen("d:/Users.txt","r");  //只读打开原文件scanf("%d",&function);if(function == 2){remove("d:/Users1.txt");  //有时会多余创造了文件,需要删除 return;}FILE *Users1 = fopen("d:/Users1.txt", "w");  //先新建一个文件存储更改后的信息printf("请输入需要更改的用户名:");for(int i = 0; i<20; i++)  //从输入流取得需要更改的读者名字{if(i==0)scanf("%c%c", &enter,&name[i]);elsescanf("%c",&name[i]);if(name[i]==10)  //将最后的换行符改为空{name[i]=0;break;}}if(function==1){while(!feof(Users)){fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook);if(strcmp(name, readName)==0){  find = 1;  //找到了此读者printf("您要将读者名\"%s\"更改为:", name);char changeName[20] = {0};for(int i = 0; i<20; i++)  //从输入流取得需要更改的用户名字{if(i==0)scanf("%c",&changeName[i]);elsescanf("%c",&changeName[i]);if(changeName[i]==10)  //将最后的换行符改为空{changeName[i]=0;break;}}ifUserExisted = fopen("d:/Book1.txt","r");   //判断更改后的名字是否会和存在的用户名冲突while(!feof(ifUserExisted)){fscanf(ifUserExisted, "%d %s %s\n", &ifNumber, ifName, ifBorrow);if (strcmp(changeName, ifName)==0){printf("更改失败:已存在名称为%s的读者\n", changeName);fclose(ifUserExisted);fclose(Users);  //关闭文件fclose(Users1);return;}}fprintf(Users1, "%d %s %s\n", readNumber, changeName, borrowBook);  //写入序号 更改后的读者名 所借书籍和换行符}elsefprintf(Users1, "%d %s %s\n", readNumber, readName, borrowBook);  //写入序号 书名 数量和换行符            }if(find==0)  //若没找到此读者{printf("没有找到此读者!请重新输入\n");break;}fclose(Users);  //关闭文件fclose(Users1);Users1 = fopen("d:/Users1.txt", "r");Users = fopen("d:/Users.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Users1)){fscanf(Users1, "%d %s %s\n", &readNumber, readName, borrowBook);fprintf(Users, "%d %s %s\n", readNumber, readName, borrowBook);}fclose(Users);fclose(Users1);remove("d:/Users1.txt");  //删除原文件              //rename("d:/Book1.txt", "d:/Book.txt");  //将更改后的文件改名为原数据文件  此方法成功率低!!!printf("更改成功!\n");}else{printf("输入格式有误,请重新输入!\n");break;}}
}//删除用户的函数
void delUsers(FILE *Users)
{while(1){printf("请输入您想删除的读者名:(输入\"-r\"返回上一级)");char delName[20] = {0};for(int i = 0; i<20; i++)  //从输入流取得需要删除的用户名字{//if(i==0)//  scanf("%c%c", &enter,&delName[i]);//elsescanf("%c",&delName[i]);if(delName[i]==10)  //将最后的换行符改为空{delName[i]=0;break;}}if(strcmp(delName, "-r")==0)  //输入返回上一级的指示后返回return;int readNumber, find = 0;char readName[20] = {0}, borrowBook[20] = {"None"};Users = fopen("d:/Users.txt","r");FILE *Users1 = fopen("d:/Users1.txt","w");while (!feof(Users)){fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook);if(strcmp(delName, readName)==0){  find = 1;  //找到了此读者//因为要删除此条信息,所以不再向新文件中输出它}else{if(find==1)fprintf(Users1, "%d %s %s\n", readNumber-1, readName, borrowBook);  //排在删除后的写入-1的序号 读者名 所借书和换行符            elsefprintf(Users1, "%d %s %s\n", readNumber, readName, borrowBook);  //删除前的写入的序号 读者名 所借书和换行符            }            }if(find==0)  //若没找到此读者{printf("没有找到此读者!请重新输入\n");continue;}fclose(Users1);fclose(Users);Users1 = fopen("d:/Users1.txt", "r");Users = fopen("d:/Users.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Users1)){fscanf(Users1, "%d %s %s\n", &readNumber, readName, borrowBook);fprintf(Users, "%d %s %s\n", readNumber, readName, borrowBook);}fclose(Users1);fclose(Users);remove("d:/Users1.txt");  //删除原文件              printf("删除成功!\n");}
}//借阅函数
void borrowBooking(char readerName[])
{printf("请输入您想借阅的图书名:");char name[20] = {0};for(int i = 0; i<20; i++)  //从输入流取得图书名{if(i==0)scanf("%c%c", &enter,&name[i]);elsescanf("%c",&name[i]);if(name[i]==10)  //将最后的换行符改为空{name[i]=0;break;}}char readName[20] = {0};int readNumber, readNum, find = 0;//更改被借阅的图书的信息FILE *Book = fopen("d:/Book.txt", "r");FILE *Book1 = fopen("d:/Book1.txt", "w");while (!feof(Book)){fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum);if(strcmp(name, readName)==0){  find = 1;if(readNum<1){printf("借阅失败:无剩余可借阅的%s!\n", readName);return;}fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum-1); //若找到需要借阅的图书,则在此书数量上减1 } elsefprintf(Book1, "%d %s %d\n", readNumber, readName, readNum);  //删除前的写入的序号 读者名 所借书和换行符 }if(find==0)  //若没找到此书{printf("借阅失败:没有找到此书!\n");return;}fclose(Book);fclose(Book1);Book1 = fopen("d:/Book1.txt", "r");Book = fopen("d:/Book.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Book1)){fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum);fprintf(Book, "%d %s %d\n", readNumber, readName, readNum);}fclose(Book1);fclose(Book);remove("d:/Book1.txt");  //删除原文件 //更改读者的信息FILE *Users = fopen("d:/Users.txt", "r");FILE *Users1 = fopen("d:/Users1.txt", "w");char borrowBook[20] = {"None"};while (!feof(Users)){fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook);if(strcmp(readerName, readName)==0)fprintf(Users1, "%d %s %s\n", readNumber, readName, name); //在读者的借阅图书上写上所借阅的图书名 elsefprintf(Users1, "%d %s %s\n", readNumber, readName, borrowBook); }fclose(Users1);fclose(Users);Users1 = fopen("d:/Users1.txt", "r");Users = fopen("d:/Users.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Users1)){fscanf(Users1, "%d %s %s\n", &readNumber, readName, borrowBook);fprintf(Users, "%d %s %s\n", readNumber, readName, borrowBook);}fclose(Users1);fclose(Users);remove("d:/Users1.txt");  //删除原文件  有时候还是删不掉printf("借阅成功!\n");
}//还书函数
void returnBooking(char readerName[], char borrowBook[])
{char readName[20] = {0};int readNumber, readNum, find = 0;//更改被还回的图书的信息FILE *Book = fopen("d:/Book.txt", "r");FILE *Book1 = fopen("d:/Book1.txt", "w");while (!feof(Book)){fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum);if(strcmp(borrowBook, readName)==0){fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum+1); //若找到被还的图书,则在此书数量上加1  find = 1;}elsefprintf(Book1, "%d %s %d\n", readNumber, readName, readNum); //不是还回的书 }fclose(Book);fclose(Book1);Book1 = fopen("d:/Book1.txt", "r");Book = fopen("d:/Book.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Book1)){fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum);fprintf(Book, "%d %s %d\n", readNumber, readName, readNum);}bookNumber = readNumber+1;fclose(Book1);fclose(Book);remove("d:/Book1.txt");  //删除原文件if(find==0)  //还书时没有书城中没有此书,直接添加一本{FILE *Book;Book = fopen("d:/Book.txt", "a");  fprintf(Book, "%d %s 1\n", bookNumber, borrowBook);  //写入序号 书名 数量和换行符bookNumber++; fclose(Book);}//更改读者的信息FILE *Users = fopen("d:/Users.txt", "r");FILE *Users1 = fopen("d:/Users1.txt", "w");char rborrowBook[20] = {"None"};while (!feof(Users)){fscanf(Users, "%d %s %s\n", &readNumber, readName, rborrowBook);if(strcmp(readerName, readName)==0)fprintf(Users1, "%d %s %s\n", readNumber, readName, "None"); //还回书后所借阅图书变为"None" elsefprintf(Users1, "%d %s %s\n", readNumber, readName, rborrowBook); }fclose(Users1);fclose(Users);Users1 = fopen("d:/Users1.txt", "r");Users = fopen("d:/Users.txt", "w+");   //刷新原文件,再次写入正确数据while(!feof(Users1)){fscanf(Users1, "%d %s %s\n", &readNumber, readName, rborrowBook);fprintf(Users, "%d %s %s\n", readNumber, readName, rborrowBook);}fclose(Users1);fclose(Users);remove("d:/Users1.txt");  //删除原文件  有时候还是删不掉printf("成功还回%s\n", borrowBook);
}//单独查询功能,根据编号或书名查询书被哪些人借走
void searchBook()
{while (1){int function = 0;FILE *Book = fopen("d:/Book.txt", "r");FILE *Users = fopen("d:/Users.txt", "r");char readerName[20] = {0}, bookName[20] = {0}, borrowBook[20] = {0}, name[20] = {0};int bookNumber, bookNum, find = 0, readerNumber;printf("                   Search                   \n");printf("[------------------------------------------]\n");printf("\t\t请选择查询功能:\n\t1.根据编号查询\n\t2.根据书名查询\n\t3.返回主界面\n");printf("[------------------------------------------]\n");scanf("%d",&function); // 输入需要的功能switch (function){case 1:printf("您要查找的书序号是:");scanf("%d",&function); // 输入需要查找的图书编号while(!feof(Book)){fscanf(Book, "%d %s %d\n", &bookNumber, bookName, &bookNum); //由于bookName已经表示地址,不需要取地址符if(bookNumber==function)  //发现查找的书后跳出循环{find = 1;//找到书break;}}if(find==0){printf("没有找到编号为%d的图书。\n",function);break;}printf("               Search Result                \n");printf("[------------------------------------------]\n");find = 0;//需要在查找谁借阅时再次使用printf("\t编号:\t\t%d\n\t书名:\t\t%s\n\t剩余数量:\t%d\n\t",bookNumber, bookName, bookNum);while (!feof(Users)){fscanf(Users, "%d %s %s\n", &readerNumber, readerName, borrowBook);//遍历读者查找谁借阅了这本书   if (strcmp(borrowBook, bookName)==0){if(find==0){find = 1;printf("借阅此书的读者:");printf("%s",readerName);}elseprintf(" ,%s",readerName);}}if(find==0)printf("还没有读者借阅此书。\n");elseprintf("\n");printf("[------------------------------------------]\n");printf("输入回车返回...\n");enter = getchar();enter = getchar();break;case 2:printf("您要查找的书名是:");scanf("%s",name); // 输入需要查找的图书名while(!feof(Book)){fscanf(Book, "%d %s %d\n", &bookNumber, bookName, &bookNum); //由于bookName已经表示地址,不需要取地址符if(strcmp(bookName, name)==0)  //发现查找的书后跳出循环{find = 1;//找到书break;}}if(find==0){printf("没有找到名称为%s的图书。\n",name);break;}printf("               Search Result                \n");printf("[------------------------------------------]\n");find = 0;//需要在查找谁借阅时再次使用printf("\t编号:\t\t%d\n\t书名:\t\t%s\n\t剩余数量:\t%d\n\t",bookNumber, bookName, bookNum);while (!feof(Users)){fscanf(Users, "%d %s %s\n", &readerNumber, readerName, borrowBook);//遍历读者查找谁借阅了这本书   if (strcmp(borrowBook, bookName)==0){if(find==0){find = 1;printf("借阅此书的读者:");printf("%s",readerName);}elseprintf(" ,%s",readerName);}}if(find==0)printf("还没有读者借阅此书。\n");elseprintf("\n");printf("[------------------------------------------]\n");printf("输入回车返回...\n");enter = getchar();enter = getchar();break;case 3:return;default:printf("您输入的格式有误,请重新输入\n");break;}fclose(Book);fclose(Users);}
}int main(int argc, char *argv[])  //需要从命令行读入参数
{char identity1[] = "-u";  //读者身份char identity2[] = "-a";  //管理员身份FILE *Book, *Users;  //两个文件分别存储图书信息和读者信息。int function1, function2; //功能选项/*调试用char readerName[20] = {0};int test = 0;scanf("%d %s",&test, readerName);if(test==1)*/if(strcmp(argv[1], identity2)==0)  //管理员操作界面{char Administrator[20] = "Zhang";if(strcmp(Administrator, argv[2])==0){    while(1){   printf("                    menu                    \n");printf("[------------------------------------------]\n");printf("     管理员您好!请选择您要使用的功能:\n  1.新增或修改图书信息\n  2.新增或修改读者信息\n  3.查看全部馆藏书籍\n  4.查看全部读者及其借阅信息\n  5.图书详情查询\n  6.结束程序\n");printf("[------------------------------------------]\n");scanf("%d",&function1);  switch (function1){case 1:  //更改图书信息printf("                  Books                     \n");printf("[------------------------------------------]\n");printf("\t请选择要对图书进行的操作:\n  1.添加图书信息\n  2.修改图书信息\n  3.删除图书信息\n  4.返回主菜单\n");printf("[------------------------------------------]\n");scanf("%d",&function2);  //输入第二级操作指令switch (function2){case 1:addBook(Book);  //调用添加图书函数break;case 2:changeBook(Book);  //修改函数break;case 3:scanf("%c",&enter);delBook(Book);  //删除函数break;case 4:break;default:printf("输入的值令有误,请重新输入");break;}break;case 2:  //更改读者信息printf("                  Readers                   \n");printf("[------------------------------------------]\n");printf("\t请选择要对用户进行的操作:\n  1.添加用户信息\n  2.修改用户信息\n  3.删除用户信息\n");printf("[------------------------------------------]\n");scanf("%d",&function2);  //输入第二级操作指令switch (function2){case 1:addUsers(Users);  //添加用户信息break;case 2:changeUsers(Users);  //修改用户信息break;case 3:scanf("%c",&enter);delUsers(Users);  //删除用户信息break;default:printf("输入的值令有误,请重新输入");break;}break;case 3:showBook(Book);printf("输入回车返回...\n");enter = getchar();enter = getchar();break;case 4:showUsers(Users);printf("输入回车返回...\n");enter = getchar();enter = getchar();break;case 5:searchBook();break;case 6:printf("感谢您的使用,再见!");return 0;default:printf("输入格式有误,请重新输入!");break;}}}elseprintf("管理员名有误,请重新输入!");}/*else if(test == 2)*/                       else if (strcmp(argv[1], identity1)==0)  //读者的操作界面{char readName[20] = {0}, borrowBook[20] = {"None"};int readNumber,find = 0;FILE *Users = fopen("d:/Users.txt","r");  //需要判断是否存在此用户while (!feof(Users)){fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook);if(strcmp(argv[2], readName)==0){   find = 1;break;}}fclose(Users);if(find==0){printf("不存在用户名为%s的读者!", argv[2]);return 0;}while (1){FILE *Users = fopen("d:/Users.txt","r");  //刷新用户的借阅信息while (!feof(Users)){fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook);if(strcmp(argv[2], readName)==0)break;}fclose(Users);printf("                    menu                    \n");printf("[------------------------------------------]\n");printf("\t读者%s您好!请选择您要使用的功能:\n  1.借阅图书\n  2.还回图书\n  3.查看全部馆藏书籍\n  4.结束程序\n", argv[2]);printf("[------------------------------------------]\n");scanf("%d",&function1);  switch (function1){case 1:  //借阅图书if(strcmp(borrowBook, "None")==0)borrowBooking(argv[2]);elseprintf("您已经借阅图书,请先还书再进行借阅操作。\n");printf("输入回车返回...\n");enter = getchar();enter = getchar();break;case 2:  //还书if(strcmp(borrowBook, "None")!=0)returnBooking(argv[2], borrowBook);elseprintf("您当前还没有借阅图书。\n");printf("输入回车返回...\n");enter = getchar();enter = getchar();break;case 3:showBook(Book);printf("输入回车返回...\n");enter = getchar();enter = getchar();break;case 4:printf("感谢您的使用,再见!");return 0;default:printf("输入格式有误,请重新输入!");break;}}}elseprintf("您输入的格式有误,请重新输入!");return 0;
}

C语言图书管理系统 文件数据库相关推荐

  1. c语言图书管理系统 - 链接数据库版(MySQL)

    大一常见作业 使用vs 2022编写,若使用dev c++可酌情修改(如scanf_s修改为scanf) 比较简陋,可自行修改 功能概述 管理员功能 添加书籍信息(会存入数据库内) 显示书籍信息 查找 ...

  2. C语言图书管理系统[2023-01-06]

    C语言图书管理系统[2023-01-06] 模仿图书馆的借书还书操作,用C语言实现图书管理系统.系统必须先登录方可进入系统. 该系统分为读者和图书管理员2类用户,若是读者登录成功后可显示该读者的借阅信 ...

  3. c语言图书馆管理程的运行截图,c语言图书管理系统

    广告 Apple iPad,AirPods Pro,Bose耳机,机械键盘,健身环等着您 对于seo工程师,更多使用永久重定向. 如果您想成为永久重定向,则只需将此代码添加到redirect()中. ...

  4. c语言-图书管理系统(顺序表)

    c语言-图书管理系统--顺序表实现增删改查 采用外部控制台运行,若直接控制台输出,则清屏命令无效 每种图书信息包括ISBN.书名.价格 具有以下几种功能 0.初始化图书表,  1.录入图书信息 ,2. ...

  5. c语言课程设计图书管理系统报告,C语言图书管理系统课程设计报告[1]

    C语言图书管理系统课程设计报告[1] 第三章 图书管理系统的设计与实现3.1 系统的需求分析图书登记管理系统作为一个应用软件将为学校的老师和学生提供一个对学校图书馆深入了解并借阅.还书的平台.根据系统 ...

  6. c语言商品管理系统文件,c语言商品管理系统(文件应用).doc

    c语言商品管理系统(文件应用) //编制于2012.11.4-5号/************************库文件包含************************/ #include//输 ...

  7. 程序逸的Java项目之旅-图书管理系统之数据库设计(2-完)

    紧接上篇博客>>>>>>程序逸的Java项目之旅-图书管理系统之数据库设计(1) 4.数据库表的创建 对于数据库表,我们可以通过cmd窗口进行创建,但那种方法有点麻 ...

  8. 简易的GUI图书管理系统(数据库Mysql)

    简易的GUI图书管理系统(数据库Mysql) 基本的思路就是一个Mysql的连接工具类,然后就是GUI图形界面显示.我这里主要是使用了DefaultTableModel来添加行数据 图片资源:在set ...

  9. c语言学生综合测评系统_c语言图书管理系统_c语言学生综合测评系统_c语言个人账本管理系统...

    c语言销售管理系统设计 c语言设计管理系统,c图书管理系统设计,学生管理系统c语言,职工管理系统c语言,c语言图书管理系统,c语言成绩管理系统,c语言管理系统,c语言银行管理系统,c语言工资管理系统, ...

  10. c语言课程设计北京电子工业出版社,c语言图书管理系统课程设计报告

    c语言图书管理系统课程设计报告 五.小节: 在这一个星期的实践中,通过编写这个图书管理系统,我体会到了c语言学习的实用性.将理论和实践结合在一起,用先进的计算机工具方便人们的生活.C语言程序的编写首先 ...

最新文章

  1. 防火墙(二)SNAT和DNAT
  2. iconfont 在vue项目中的应用(icon-component组件)
  3. 炙手可热的前端资源大集合
  4. oracle双机冷备方案,Oracle 11g双机冷备
  5. 【ios】如何成为一名ios开发
  6. TFS(Visual Studio Team Services) / Azure Devops git认证失败 authentication fails 的解决方案 http协议
  7. phpstudy 升级mysql 及MySQL服务等问题
  8. java 通过eclipse编辑器用mysql尝试 连接数据库
  9. 一个不会言谈的程序猿,惊奇发现自己能力的多么的优秀
  10. 获取Linux服务器信息脚本
  11. Atitit 同步获取阻塞式命令行输出 费阻塞式样命令行执行完毕后退出了,可以直接获取其输出 InputStream is = new StreamGobbler(session.getStd
  12. Robo 3T安装及使用
  13. 小管家进销存 v3.1 bt
  14. Word重复操作快捷键F4
  15. java矩形面积_Java编程求矩形的面积
  16. 注册表去掉多余的安全删除硬件图标
  17. 机械原理(机电)_简要问答_笔记
  18. 从飞信,超信看中国通讯行业的不作为
  19. JAVA random 缺陷_Random在高并发下的缺陷以及JUC对其的优化
  20. 任正非让寒气传递到每个人身上,互联网寒冬程序员该如何破冰?

热门文章

  1. 消息中间件-ActivityMQ系列文章-入门及例子
  2. 发那科机器人寄存器Ar_发那科机器人数据寄存器和位置寄存器的运用介绍
  3. GIT可视化工具 代码上传工具
  4. 高等数学张宇18讲 第十四讲 数学一、数学二专题内容
  5. IEEE-access 模板LaTeX Error: Something's wrong--perhaps a missing \item.
  6. 电脑突然调节不了亮度?让我教你来恢复
  7. javascript 文件转base64
  8. python visio_再见,Visio! - Python绿色通道的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. jsp购物车加mysql_网上购物车(jsp+servlet+mysql)
  10. LayUI文档和技术支持网站