一、简单实现

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实现图书馆管理系统,登录、注册、借书、还书和新增书籍相关推荐

  1. c语言课程设计(图书馆管理系统)

    大一c语言课程设计:图书馆管理系统. 图书管理系统,功能齐全拿来就能用 1.主界面 代码段 void main() { int n;Sleep(300);loop1:tongji(); printf( ...

  2. 简单文件数据库-模拟图书馆管理系统

    题目要求 编写一个程序模拟图书管理系统.用户分为管理员和读者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择.读者菜单包括借书.还书.查询等功能.管理员菜单包括图书和读者信息录入.修改和删除 ...

  3. 图书馆管理系统c语言 借书还书,急求程序!!!简单图书馆借/还书管理子系统...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 项目需求 通过此系统可以实现如下功能 1)完成对读者.书的基本信息以及借/还书的信息进行插入.删除.修改.保存等编辑功能: 2)书的库存量随着借/还书的情 ...

  4. java实现登录注册案例_Java基于IO版实现用户登录注册的案例

    下面小编就为大家带来一篇基于IO版的用户登录注册实例(Java).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 今天学的是用户登录注册功能. 4个包: itcast.c ...

  5. 《图书馆管理系统——“借书还书”模块》项目研发阶段性总结

    <图书馆管理系统--"借书还书"模块>项目研发阶段性总结 本次任务完成时间:2021年8月2日-2021年8月10日 完成模块功能:借书还书 一.功能实现 借书还书主要 ...

  6. 计算机课程设计之图书借阅小程序-图书馆借阅管理小程序代码-校园图书馆借书还书小程序

    计算机课程设计之图书借阅小程序-图书馆借阅管理小程序代码-校园图书馆借书还书小程序 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 框架:SSM(Spring ...

  7. 《图书管理系统——“借书还书”模块》

    <图书管理系统--"借书还书"模块>项目研发阶段性总结 作者:肖丽姣 本次任务完成时间:2021年7月14日-2021年8月8日 完成模块功能:借书还书 一.功能实现 ...

  8. 图书馆管理系统-登录与注册部分(c语言实现)

    大一的上学期学习了半年c语言,最终实践课的要求是做一份系统,最终个人选择了图书馆管理系统,其中又分为了几个小模块: 1.用户模块 2.管理员模块 3.图书模块 4.主模块 其中本文主要讲用户与管理员模 ...

  9. 车辆管理系统c语言课程设计报告,图书馆管理系统C语言课程设计报告

    湖北科技大学程序设计课程设计报告项目名称: 图书馆管理系统学生名称: 朱捷学生编号: 2014117241班级: 软工作者1411指导老师: 龚雄星日期: 2016.2.251项目描述设计图书管理系统 ...

  10. C语言 文件IO的使用

    简单介绍C语言文件操作函数的用法(可以直接使用): fopen fclose fprintf fscanf fputc fgetc fread fwrite 头文件 #include<stdio ...

最新文章

  1. VCSA中配置时间和时区,实测至6.5适用
  2. 将搜索二叉树转换成双向链表
  3. Java泛型总结--转
  4. 【leetcode】762. 二进制表示中质数个计算置位
  5. 蓝桥杯-回文数(java)
  6. endnote初始化数据库支持_5 个免费的在线 SQL 数据库环境,比Navicat 香
  7. Oracle数据库安然计谋分析(二)
  8. 数据结构拾遗(3) --红黑树的设计与实现(下)
  9. 32mU盘 Linux x86,我有一个32M的U盘,大家帮我想想这个东西如何利用?
  10. 我只注视你全cg存档_在暴戾的他怀里撒个娇 作者:春风榴火全娱乐圈都在等我们离婚作者:魔安...
  11. 安卓手机定时启动钉钉_钉钉自动打卡辅助神器
  12. test English
  13. WPS公式标号对齐,公式居中问题
  14. 电分糊涂日记之《电路频率响应》
  15. 京东饭粒捡漏V1.0.8
  16. java-常量和变量
  17. 年后跳槽如何准备?(转)
  18. 微信支付宝支付如何盈利?盈利如何?
  19. c语言输入f1到f11,同花顺功能键f1到f11,谁能告诉我F1到F10各键的功能?
  20. unique(C++)函数(最新、最全面总结)

热门文章

  1. 前端 js 基于react ts的excel文件模板下载 文件导入、导出
  2. 浏览器开发者工具,自己设置屏幕分辨率调试(chrome)
  3. 图论及其应用 2009年 期末考试答案 总结
  4. 新萝卜家园Ghost XP SP3电脑城装机版2013.08
  5. dedecms采集织梦免写规则登陆模块软件
  6. 笔画输入法6.8豪华版 破解版
  7. 数据结构试卷及答案(九)
  8. 模型类中的常用字段类型
  9. vijos 1071 01背包
  10. vijos 1082