C语言文件IO实现图书馆管理系统,登录、注册、借书、还书和新增书籍
一、简单实现
library.c
#include<stdio.h> //图书馆管理系统面向多用户,最多可借十本书
#include<string.h>
#include<stdlib.h> //书籍管理者,账号 :management 密码:自定义
#include"manage.h" FILE *ma;
FILE *fp, *yh, *pt, *yh1;
int a=1;int main(void)
{ int number;int bookamount, i=0, sizename;char title[10], title1[10], returnbook[10];char username[20], username1[20], username2[20], password[10], password1[10];char simplebook[10], allbook[10][10] = {"1","1","1","1","1","1","1","1","1","1"}; printf("==========欢迎来到图书馆==========\n"); break1: printf("1:登录\n2:注册\n3:退出\n输入操作序号:");number = number_1(); //返回操作数字 if (number == 3) {exit_t();}printf("用户名:");scanf("%s", &username); printf("密码:");scanf("%s", &password);char content[20] = "目录#";strcpy(username2, username);strcat(username2, "||");strcat(content, username); strcat(username, "||");strcat(username, password); //合并用户名和密码 //登录 if (number == 1){fp = fopen("userinfo1", "r");while (fscanf(fp, "%s", username1) == 1) {if (strcmp(username, username1)!=0) //用户名和密码验证 {a = 0; }else{printf("登录成功!\n");a = 1; break;}}if (a == 0){printf("登录失败!用户或密码错误!\n");goto break1; }}else if (number ==2 ) //注册{ printf("密码确认:");scanf("%s", &password1);sizename = sizeusername(username2); //返回输入了多少个字符串 fp = fopen("userinfo1", "r"); //验证用户名是否重复 while (fscanf(fp, "%s", username1) == 1) {if (strncmp(username1, username2, sizename) == 0){printf("用户名重复!\n");fclose(fp);goto break1; } } fclose(fp);if (strcmp(password, password1) != 0){printf("注册失败!密码不一致。\n"); goto break1; }else{printf("注册成功!\n");strcat(username, "\n"); //合并换行,加入换行是为了更好的在文件中显示fp = fopen("userinfo1", "a+");fprintf(fp, username); }}if (strncmp(username, "management||", 7) == 0); //判断是否为管理员,如果是管理员跳转{management(); }allbooktitle(); //借书还书break2: printf("1:借书\n2:还书\n3:退出\n输入操作序号:");number = number_1(); yh = fopen(content, "a+"); if (number == 1) //借书,限制借书本数10本 { bookamount = 0; while (fscanf(yh, "%s", title1) == 1){bookamount++; }if (bookamount < 10) //判断借书是否超过10本 {printf("输入借书名称:"); scanf("%s", title);yh1 = fopen(content, "r"); while (fscanf(yh1, "%s", title1) == 1) {if (strcmp(title1, title) == 0){printf("已借此书!\n");fclose(yh1);goto break2;}} fclose(yh1);a = findbook(title);if (a != 0){printf("查无此书!\n");goto break2;}strcat(title, "\n"); fprintf(yh, title); fclose(yh); printf("借书成功!\n"); goto break2;}else{printf("借书数量以上线,请还书!\n");goto break2; } }else if (number == 2 ) //还书 {a = 0; printf("已借书目录:\n"); //打印已借书目录while (fscanf(yh, "%s", title1)==1){a++;printf(" %s 、", title1);if(a % 5 == 0)printf("\n");else;} printf("\n还书名称:");scanf("%s", returnbook); fseek(yh, 0L, SEEK_SET); while (fscanf(yh, "%s", title1) == 1) { a = 1;if (strcmp(title1,returnbook) == 0) //检查是否有此书,返回为0则有 {bookamount = 0;fseek(yh, 0L, SEEK_SET); while (fscanf(yh, "%s", simplebook) == 1) //将已借的书储存在数组中 {strcpy(allbook[bookamount], simplebook);bookamount++;}fclose(yh); pt = fopen(content, "w");for (i = 0; i < 10; i++){if (strcmp(allbook[i], "1") == 0) break;if (strcmp(allbook[i], returnbook) != 0){strcat(allbook[i], "\n");fprintf(pt, allbook[i]);}}printf("还书成功!\n");fclose(pt); break;}else a = 0; }if (a != 1){printf("查无此书!请重新操作。\n");}goto break2; }else //退出{exit_t();}return 0;
}
management.h
#include<stdio.h>
#include<string.h>
#include<stdlib.h>extern FILE *fp, *yh, *pt, *yh1;
extern FILE *ma;
extern int a;int number_1() //得出操作数字
{int breaknumber;char number1[10];while ( scanf("%s", &number1) ) {if (strcmp(number1, "1") == 0){breaknumber = 1;return breaknumber;break;}else if ( strcmp(number1, "2")==0 ){breaknumber=2;return breaknumber;break;}else if ( strcmp(number1, "3") == 0){breaknumber=3;return breaknumber;break;}else{printf("输入错误!\n输入操作序号:");}}
} int sizeusername(char s[20]) //得出输入了多少个字符串
{int i = 0, ch = 0;while ( s[i] != '\0'){ch++; i++;}return ch;
}void exit_t() //退出
{printf("退出成功!\n");fclose(fp);fclose(yh);exit(0);
}void allbooktitle() //输出图书馆书籍
{a=0;char bookname[10];ma=fopen("书籍","r");printf("图书馆书籍:\n");while ( fscanf(ma, "%s", bookname) == 1){a++;printf(" %s 、", bookname);if(a%8==0){printf("\n");} }fclose(ma);printf("\n");} int findbook(char bookname[10]) //判断书籍中是否有此书 {char simplebook[10];ma = fopen("书籍","r");while ( fscanf(ma, "%s", simplebook) == 1) { a=1;if( strcmp(simplebook, bookname) == 0) {a=0;break;}}fclose(ma);return a;
}void management()
{int number;char bookname[10],title1[10];break3: printf("1:更改书籍\n2:查看数据\n3:退出\n输入操作序号:");number = number_1();if (number == 1) {break4: printf("1:添加\n2:删除\n3:返回\n输入操作序号:");number = number_1();if(number == 1) //添加 {ma = fopen("书籍", "a+");printf("输入书籍名称:");scanf("%s",&bookname); yh1 = fopen("书籍", "r"); while( fscanf(yh1, "%s", title1) == 1) {if( strcmp(title1, bookname) == 0){printf("已有此书!\n");fclose(yh1);goto break4;}} fclose(yh1);strcat(bookname, "\n");fprintf(ma, bookname);fclose(ma);printf("添加成功!\n");goto break4;}else if (number == 2) //删除 {allbooktitle();FILE *ma1;char outbook[10];printf("输入移除的书籍:"); scanf("%s", &outbook);a = findbook(outbook);if (a != 0);{printf("查无此书!\n");goto break4;}ma = fopen("书籍", "r");ma1 = fopen("中间书籍", "w");while (fscanf(ma, "%s", bookname) == 1){if (strcmp(bookname, outbook) != 0){strcat(bookname, "\n");fprintf(ma1, bookname);}} fclose(ma1);fclose(ma);ma=fopen("书籍", "w");ma1=fopen("中间书籍", "r");while(fscanf(ma1, "%s", bookname)==1){strcat(bookname, "\n");fprintf(ma, bookname);}fclose(ma1);fclose(ma);printf("删除成功!\n");goto break4;}else goto break3;}else if (number == 2) {break5: printf("1:查看书籍\n2:查看用户\n3:返回\n输入操作序号:");number = number_1();if(number == 1) //查看书籍 {allbooktitle();goto break5;}else if (number == 2) //查看用户{ma = fopen("userinfo1", "r");printf("用户名||密码:\n");while(fscanf(ma, "%s", bookname) == 1){printf("%s", bookname);printf("\n");}fclose(ma);goto break5;}else goto break3;}else exit_t(); //退出
}
首次使用要先注册名称management,密码自定义,作为管理将书籍写入,有错请联系删改,谢谢!
建议:文件指针的引用很乱,建议自己写代码时不要定义全局变量;可以通过函数传递指针,用完文件指针及时关闭,goto最好语句不要用。
要养成良好的代码书写格式。
二、加入链表
具体内容不变,相关函数变了。
manage2.h
#ifndef MANAGE_H_
#define MANAGE_H_#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h> typedef struct node
{char Item[20];struct node *next;}Node;typedef struct{Node *list;
}Link;/*得出输入数字 */
/*返回值为1,2,3 */
int number_1(void);/*得出输入了多少个字符串 */
int sizeusername(char s[20]);/*退出 */
void exit_t(Link *plist);/*管理员 */
void management(Link* plist);/*链表初始化 */
void InitializeList(Link* plist);/*确定链表是否为空 */
bool ListIsEmpty(const Link* plist);/*确定链表是否为满 */
/*返回true为还有内存空间,否则无可利用空间*/
bool ListIsFull(const Link* plist);/*链表末尾添加项 */
/*返回true添加成功,否则失败 */
bool AddItem(char item[], Link *plist);/*遍历链表,把函数作用于每一项 */
/*返回true为找到传入的字符串,否则没有该项*/
bool Traverse(const Link* plist, void (*pfun)(char item[]), char str[]);/*释放已分配内存 */
void EmptyTheLlist(Link* plist);/*链表实现书籍的输出 */
void allbooktitle(Link* plist); #endif
manage2.c
#include"manage.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h> extern FILE *fp, *yh, *pt, *yh1;
extern FILE *ma;
extern int a;/*输出函数 */
static void ShowItem(char item[]);/*得出输入数字 */
int number_1(void)
{int breaknumber;char number1[10];while (scanf("%s", &number1)) {if (strcmp(number1, "1") == 0) {breaknumber = 1;return breaknumber;}else if (strcmp(number1, "2") == 0 ) {breaknumber = 2;return breaknumber;}else if (strcmp(number1, "3") == 0) {breaknumber = 3;return breaknumber;break;}elseprintf("输入错误!\n输入操作序号:");}
} /*得出输入了多少个字符串*/
int sizeusername(char s[20])
{int i = 0, ch = 0;while(s[i] != '\0') {ch++; i++;}return ch;
}/*退出 */
void exit_t(Link *plist)
{EmptyTheLlist(plist);printf("退出成功!\n");fclose(fp);fclose(yh);exit(0);
}/*管理员*/
void management(Link* plist)
{bool right;int number;char bookname[10], title1[10];
break3: printf("1:更改书籍\n2:查看数据\n3:退出\n输入操作序号:");number = number_1();if (number == 1) {
break4: printf("1:添加\n2:删除\n3:返回\n输入操作序号:");number = number_1();if (number == 1) {//添加ma = fopen("书籍", "a+");printf("输入书籍名称:");scanf("%s", &bookname); yh1 = fopen("书籍", "r"); while (fscanf(yh1, "%s", title1) == 1) {if (strcmp(title1, bookname) == 0) {printf("已有此书!\n");fclose(yh1);goto break4;}} fclose(yh1);strcat(bookname, "\n");fprintf(ma, bookname);fclose(ma);printf("添加成功!\n");goto break4;}else if(number==2){ //删除 allbooktitle(plist);FILE *ma1;char outbook[10];printf("输入移除的书籍:"); scanf("%s", &outbook);right = Traverse(plist, NULL, outbook);if (right == false) {printf("查无此书!\n");goto break4;}ma = fopen("书籍", "r");ma1 = fopen("中间书籍", "w");while (fscanf(ma, "%s", bookname) == 1) {if (strcmp(bookname, outbook) != 0) {strcat(bookname,"\n");fprintf(ma1,bookname);} } fclose(ma1);fclose(ma);ma = fopen("书籍", "w");ma1 = fopen("中间书籍", "r");while(fscanf(ma1, "%s", bookname) == 1) {strcat(bookname, "\n");fprintf(ma, bookname);}fclose(ma1);fclose(ma);printf("删除成功!\n");goto break4;}elsegoto break3;}else if(number == 2) {break5: printf("1:查看书籍\n2:查看用户\n3:返回\n输入操作序号:");number = number_1();if (number == 1){ //查看书籍 allbooktitle(plist);goto break5;}else if (number == 2) //查看用户{ma = fopen("userinfo1","r");printf("用户名||密码:\n");while (fscanf(ma, "%s", bookname) == 1) {printf("%s",bookname);printf("\n");}fclose(ma);goto break5;}elsegoto break3;}else exit_t(NULL); //退出
}/*链表初始化*/
void InitializeList(Link* plist)
{plist->list = NULL;
}/*确定链表是否为空 */
bool ListIsEmpty(const Link* plist)
{if (plist->list == NULL) {return false;}else {return true;}
}/*确定链表是否为满 */
bool ListIsFull(const Link* plist)
{int num;Node* p;p = (Node*)malloc(sizeof(Node));if (p == NULL) {num = 0;}else {num = 1;}free(p);if (num == 0)return false;elsereturn true;
}/*链表末尾添加项 */
bool AddItem(char item[], Link* plist)
{bool full = ListIsFull(plist);if (full == false) {printf("链表以满!\n");return false;}Node* pnew;Node* scan = plist->list;pnew = (Node*)malloc(sizeof(Node));if (pnew == NULL) {return false;}strcpy(pnew->Item, item);pnew->next = NULL;if (plist->list == NULL) {plist->list = pnew;}else{while (scan->next != NULL) {scan = scan->next;}scan->next = pnew;}return true;
}/*遍历链表,把函数作用于每一项*/
bool Traverse(const Link* plist, void (*pfun)(char item[]), char str[])
{int n = 0;bool right;if(right = ListIsEmpty(plist) == false){printf("无书籍\n");return false;}Node* scan = plist->list;if(str == NULL){printf("图书馆书籍:\n");while (scan != NULL) {(*pfun)(scan->Item);scan = scan->next;n++;if(n%8 == 0){printf("\n");}}return true;}else{while (scan != NULL) { if (strcmp(scan->Item,str) == 0){return true;} scan = scan->next;}}return false;
}/*输出函数 */
static void ShowItem(char item[])
{printf("% -15s ", item);
}/*释放已分配内存 */
void EmptyTheLlist(Link* plist)
{Node* psave;while (plist->list = NULL){psave = plist->list->next;free(plist->list);plist->list = psave;}
}/*链表实现书籍的输出 */
void allbooktitle(Link* plist)
{bool right;EmptyTheLlist(plist);FILE* fpuser;fpuser = fopen("书籍", "r");char bookname[10];InitializeList(plist);while (fscanf(fpuser, "%s", bookname) == 1){right = AddItem(bookname, plist);if(right == false){return; }}Traverse(plist, ShowItem, NULL);fclose(fpuser);printf("\n");
}
library2.c
#include<stdio.h> //图书馆管理系统面向多用户,最多可借十本书
#include<string.h>
#include<stdlib.h>
#include<stdbool.h> //书籍管理者,账号 :management 密码:777
#include"manage.h" FILE *ma;
FILE *fp, *yh, *pt, *yh1;
int a=1;int main(void)
{ bool right; int number;Link plink;int bookamount, i=0, sizename;char title[10], title1[10], returnbook[10];char username[20], username1[20], username2[20], password[10], password1[10];char simplebook[10], allbook[10][10] = {"1","1","1","1","1","1","1","1","1","1"}; printf("==========欢迎来到图书馆==========\n");
break1: printf("1:登录\n2:注册\n3:退出\n输入操作序号:");number = number_1(); //返回操作数字 if (number == 3) {exit_t(&plink);}printf("用户名:");scanf("%s", &username); printf("密码:");scanf("%s", &password);char content[20] = "目录#";strcpy(username2, username);strcat(username2, "||");strcat(content, username); strcat(username, "||");strcat(username, password); //合并用户名和密码 /*登录*/ if (number == 1){fp = fopen("userinfo1", "r");while (fscanf(fp, "%s", username1) == 1){if (strcmp(username,username1) != 0) a = 0; //用户名和密码验证 else{printf("登录成功!\n");a = 1;break;}}if(a == 0){printf("登录失败!用户或密码错误!\n");goto break1; } }else if (number == 2) /*注册*/{ printf("密码确认:");scanf("%s", &password1);sizename = sizeusername(username2); //返回输入了多少个字符串 fp = fopen("userinfo1", "r"); //验证用户名是否重复 while (fscanf(fp,"%s",username1) == 1) {if (strncmp(username1, username2, sizename) == 0) {printf("用户名重复!\n");fclose(fp);goto break1; } } fclose(fp);if (strcmp(password, password1) != 0) {printf("注册失败!密码不一致。\n"); goto break1; }else {printf("注册成功!\n");strcat(username, "\n"); //合并换行,加入换行是为了更好的在文件中显示fp = fopen("userinfo1", "a+");fprintf(fp, username); }}if (strncmp(username, "management||", 7) != 0); //判断是否为管理员,如果是管理员跳转else management(&plink);allbooktitle(&plink);//借书还书
break2: printf("1:借书\n2:还书\n3:退出\n输入操作序号:");number = number_1(); yh = fopen(content, "a+"); if (number == 1) //借书,限制借书本数10本 {bookamount = 0; while (fscanf(yh, "%s", title1) == 1)bookamount++;if (bookamount < 10) {//判断借书是否超过10本printf("输入借书名称:"); scanf("%s", title);yh1 = fopen(content, "r"); while (fscanf(yh1, "%s", title1) == 1) {if (strcmp(title1, title) == 0) {printf("已借此书!\n");fclose(yh1);goto break2;}} fclose(yh1);right = Traverse(&plink, NULL, title);if (right == false) {printf("查无此书!\n");goto break2;}strcat(title, "\n"); fprintf(yh, title); fclose(yh); printf("借书成功!\n"); goto break2;}else {printf("借书数量以上线,请还书!\n");goto break2; } }else if (number == 2 ){ //还书 a = 0; printf("已借书目录:\n"); //打印已借书目录while (fscanf(yh, "%s", title1) == 1) {a++;printf(" %-15s ", title1);if (a % 5 == 0)printf("\n");} printf("\n还书名称:");scanf("%s", returnbook); fseek(yh,0L, SEEK_SET); while (fscanf(yh, "%s", title1) == 1) { a =1 ;if (strcmp(title1, returnbook) == 0) {//检查是否有此书,返回为0则有 bookamount = 0;fseek(yh, 0L, SEEK_SET); while (fscanf(yh, "%s", simplebook) == 1) { //将已借的书储存在数组中 strcpy(allbook[bookamount], simplebook);bookamount++;}fclose(yh); pt = fopen(content, "w"); for(i=0; i<10; i++) {if (strcmp(allbook[i],"1") == 0)break;if (strcmp(allbook[i], returnbook) != 0) {strcat(allbook[i], "\n");fprintf(pt, allbook[i]);}}printf("还书成功!\n");fclose(pt); break;}else a = 0; }if (a == 1);elseprintf("查无此书!请重新操作。\n");goto break2; }else //退出exit_t(&plink);return 0;
}
C语言文件IO实现图书馆管理系统,登录、注册、借书、还书和新增书籍相关推荐
- c语言课程设计(图书馆管理系统)
大一c语言课程设计:图书馆管理系统. 图书管理系统,功能齐全拿来就能用 1.主界面 代码段 void main() { int n;Sleep(300);loop1:tongji(); printf( ...
- 简单文件数据库-模拟图书馆管理系统
题目要求 编写一个程序模拟图书管理系统.用户分为管理员和读者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择.读者菜单包括借书.还书.查询等功能.管理员菜单包括图书和读者信息录入.修改和删除 ...
- 图书馆管理系统c语言 借书还书,急求程序!!!简单图书馆借/还书管理子系统...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 项目需求 通过此系统可以实现如下功能 1)完成对读者.书的基本信息以及借/还书的信息进行插入.删除.修改.保存等编辑功能: 2)书的库存量随着借/还书的情 ...
- java实现登录注册案例_Java基于IO版实现用户登录注册的案例
下面小编就为大家带来一篇基于IO版的用户登录注册实例(Java).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 今天学的是用户登录注册功能. 4个包: itcast.c ...
- 《图书馆管理系统——“借书还书”模块》项目研发阶段性总结
<图书馆管理系统--"借书还书"模块>项目研发阶段性总结 本次任务完成时间:2021年8月2日-2021年8月10日 完成模块功能:借书还书 一.功能实现 借书还书主要 ...
- 计算机课程设计之图书借阅小程序-图书馆借阅管理小程序代码-校园图书馆借书还书小程序
计算机课程设计之图书借阅小程序-图书馆借阅管理小程序代码-校园图书馆借书还书小程序 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 框架:SSM(Spring ...
- 《图书管理系统——“借书还书”模块》
<图书管理系统--"借书还书"模块>项目研发阶段性总结 作者:肖丽姣 本次任务完成时间:2021年7月14日-2021年8月8日 完成模块功能:借书还书 一.功能实现 ...
- 图书馆管理系统-登录与注册部分(c语言实现)
大一的上学期学习了半年c语言,最终实践课的要求是做一份系统,最终个人选择了图书馆管理系统,其中又分为了几个小模块: 1.用户模块 2.管理员模块 3.图书模块 4.主模块 其中本文主要讲用户与管理员模 ...
- 车辆管理系统c语言课程设计报告,图书馆管理系统C语言课程设计报告
湖北科技大学程序设计课程设计报告项目名称: 图书馆管理系统学生名称: 朱捷学生编号: 2014117241班级: 软工作者1411指导老师: 龚雄星日期: 2016.2.251项目描述设计图书管理系统 ...
- C语言 文件IO的使用
简单介绍C语言文件操作函数的用法(可以直接使用): fopen fclose fprintf fscanf fputc fgetc fread fwrite 头文件 #include<stdio ...
最新文章
- VCSA中配置时间和时区,实测至6.5适用
- 将搜索二叉树转换成双向链表
- Java泛型总结--转
- 【leetcode】762. 二进制表示中质数个计算置位
- 蓝桥杯-回文数(java)
- endnote初始化数据库支持_5 个免费的在线 SQL 数据库环境,比Navicat 香
- Oracle数据库安然计谋分析(二)
- 数据结构拾遗(3) --红黑树的设计与实现(下)
- 32mU盘 Linux x86,我有一个32M的U盘,大家帮我想想这个东西如何利用?
- 我只注视你全cg存档_在暴戾的他怀里撒个娇 作者:春风榴火全娱乐圈都在等我们离婚作者:魔安...
- 安卓手机定时启动钉钉_钉钉自动打卡辅助神器
- test English
- WPS公式标号对齐,公式居中问题
- 电分糊涂日记之《电路频率响应》
- 京东饭粒捡漏V1.0.8
- java-常量和变量
- 年后跳槽如何准备?(转)
- 微信支付宝支付如何盈利?盈利如何?
- c语言输入f1到f11,同花顺功能键f1到f11,谁能告诉我F1到F10各键的功能?
- unique(C++)函数(最新、最全面总结)