C语言 共享单车管理系统(读取、写入、删除文件中数据)
代码在Dev Cpp中编译未出现错误,如果无法运行,请考虑不同编译器之间的差别适当改正代码(使用.cpp格式)
大一小学期学校要求制作不少于1000行的C语言代码程序,学习一年下来属实懵了,因为教学课程只有简单的几种代码,连封装函数我都不明白,在参考了很多资料后终于写出了一份果,虽然各种语句有不成熟的地方,甚至有些函数没用上,但是做下来这一轮项目,确实学会了很多东西,接下来把我的代码分享给大家,如果我的代码的一部分能帮助到各位,属实是我的荣幸。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include<windows.h> #include<time.h> //初始界面输入神秘代码10086进入????????界面 float bike_money;//定义金额 char gName[20]; void print(); //初始界面 void begin();//选择注册或登录 void regist();//注册 void creatInform();//用户基本信息 void after_regist();//创建后选择回到上一级或者登录 void login();//登录界面 int match(char a[20],char b[20]);//检测文件中账号密码 和输入是否匹配 void user_menu();//用户界面 void userKey();//用户选择 void use_bike();//租车 void print_time();//打印时间 void get_time();//获取当前时间并存入文件 int num_bike();//统计单车信息 void user_browseBike();//浏览单车信息 void return_bike();//还车 int num_use_bike();//统计使用中的单车个数 int calculate_time();//计算使用时间 int get_num(float data);//统计余额位数 float calculate_money(int data,float money);//计算用户花费金额 void delete_time();//删除用完的时间 void add_money();//充值系统 void check_money();//查看余额 void change_pas();//更改密码 void manage_menu();//管理员菜单 void keyDown();//对管理员菜单的选择 void add_bike();//添加单车 void delete_bike();//删除单车 void lookup_choice();//查找信息 void lookup_bike();//查找单车信息 void lookup_user();//查找用户信息 int num_user();//统计用户信息 void browseUser();//浏览用户信息 void browseBike();//浏览单车信息 float calculate();//资金流动情况 typedef struct User//用户登录信息 { char username[20]; char userpas[20]; struct User *next; }User,*uNode; typedef struct Inform//用户账号信息 { char username[20]; char name[20]; int age; char sex[10]; char tel[12]; float money; struct Inform *next; }Inform,*iNode; typedef struct Bike//单车信息 { char address[100];//地址 char num[20];//单车编号 int usetime;//使用次数,每使用20次检查一遍并清空 float price;//每小时花费金额 float makemoney; //赚取的金额 float cost;//成本价格 struct Bike *next; }Bike,*bNode; typedef struct Time//时间信息 { char num[20]; int time; struct Time *next; }Time,*tNode; void print() //初始界面 { system("cls"); printf("\n\n\n\n\n\n\t\t\t\t_______________________________________\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 请选择 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 我已注册过——请按 1 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 我是新用户——请按 2 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 退 出——请按 0 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t|______________________________________|\n"); printf("\t\t\t\t请输入:"); begin(); } void begin()//选择注册或登录 { int choice=0; scanf("%d",&choice); switch(choice) { case 1: login(); break; case 2: regist(); break; case 10086: manage_menu(); break; case 0: exit(1); default: print(); break; } } void regist()//注册 { system("title 创建账号");//改变标题 FILE *fp; int hit; char username[20],_username[20]; char userpas[20],userpas1[20],_userpas[20]; if((fp=fopen("user.txt","r"))==NULL)//如果不存在user.txt,创建user.txt { fp=fopen("user.txt","w+"); fclose(fp); } system("cls"); for(;;) { printf("\n\n\n\n\n\n\t\t\t\t_____________________________________________\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 注册界面 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 请输入用户名: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 请输入密 码: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 再次确认密码: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t|____________________________________________|\n"); COORD sin_up_name = { 57, 10 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_name);//改变光标位置 scanf("%s",&username); fp=fopen("user.txt","r"); for(;!feof(fp);) { fscanf(fp,"%s%s",_username,_userpas); if(strcmp(username,_username)==0) { COORD name_same = { 32, 18 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), name_same); printf("该用户名已存在,请输入其他用户名."); getch(); regist(); } } fclose(fp); strcpy(gName,username); COORD sin_up_pasword = { 57, 12 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_pasword);//改变光标位置 char key; int i=0,j=0; while((key=_getch())!='\r')//如果没有输入回车 { if(i<19) { userpas[i++]=key;//每输入一个字符,打印一个*,让密码不可见 printf("*"); } else { COORD sin_pas_too_long = { 32, 18 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_too_long); printf("密码过长,该密码不可用!\n"); printf("\t\t\t\t即将返回重新注册..."); getch(); regist(); } } COORD sin_up_pasword_again = { 57, 14 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_pasword_again);//改变光标位置 while((key=_getch())!='\r')//如果没有输入回车 { if(j<19) { userpas1[j++]=key; printf("*"); } else { COORD sin_pas_again_too_long = { 32, 18 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_again_too_long); printf("\t密码过长,该密码不可用!\n"); printf("\t即将返回重新注册..."); getch(); regist(); } } if(strcmp(userpas,userpas1)==0)//对比两次输入密码是否一致 { fp=fopen("user.txt","a");//打开user.txt指针指到文件最后 fprintf(fp,"%s\t%s\n",username,userpas); break; } else { COORD sin_pas_error = { 28, 18 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_error); printf("\t两次密码不一致,请重新输入,退出请按ESC"); hit=getch(); if(hit=27) ; system("cls"); print(); } } fclose(fp); COORD sin_up_sucess = { 28, 18 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_sucess); printf("\t创建成功,按任意键返回"); getch(); system("cls"); creatInform(); after_regist(); } void creatInform()//用户基本信息 { system("title 用户信息录入"); FILE *fp; char username[20],name[20],sex[10],tel[12],s[12]; int age,i=0,j; float money; if((fp=fopen("Inform.txt","r"))==NULL) { fp=fopen("Inform.txt","w"); fclose(fp); } fp=fopen("Inform.txt","a"); system("cls"); printf("请输入您的基本信息,务必确认用户名输入正确,否则将无法使用单车!\n"); getch(); system("cls"); printf("\n\n\n\n\n\n\t\t\t\t_____________________________________________\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 用户信息 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 请输入用户名: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 姓 名: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 年 龄: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 性 别: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 电 话: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t|____________________________________________|\n"); COORD sin_up_name = { 57, 10 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_name);//改变光标位置 scanf("%s",&username); if(strcmp(gName,username)!=0) { COORD user_name = { 31, 22 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_name);//改变光标位置 printf("用户名检测错误,请输入与注册时相同的用户名!"); getch(); creatInform(); } COORD user_name = { 57, 12 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_name);//改变光标位置 scanf("%s",&name); COORD user_age = { 57, 14 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_age);//改变光标位置 scanf("%d",&age); COORD user_sex = { 57, 16 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_sex);//改变光标位置 scanf("%s",&sex); for(;;) { COORD error = { 31, 22 }; COORD user_tel = { 57, 18 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_tel); printf(" "); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_tel); scanf("%s",&tel) ; strcpy(s,tel); if(strlen(tel)!=11) { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error); printf(" "); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error); printf("请输入十一位电话号码!"); getch(); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error); printf(" "); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_tel); } for(j=0;(size_t)j<strlen(s);j++) { if(s[j]<'0'||s[j]>'9') { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error); printf(" "); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error); printf("电话号只能为数字!重新输入!"); getch(); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error); printf(" "); break; } } if(strlen(tel)==11&&(size_t)j==strlen(s)) { break; } } fprintf(fp,"%s\t%s\t%d\t%s\t%s\t",username,name,age,sex,tel); COORD over = { 31, 22 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), over); printf("数据录入成功!"); getch(); system("cls"); printf("当前余额为%.1f,无法使用单车,请充值后使用",money); printf("\n充值金额:"); scanf("%f",&money); fprintf(fp,"%.1f\n",money); fclose(fp); } void after_regist()//创建后选择回到上一级或者登录 { system("cls"); printf("请选择登录(0)或返回(1):"); int choice=0; scanf("%d",&choice); switch(choice) { case 0: login(); break; case 1: print(); break; default: after_regist(); break; } } void login()//登录界面 { system("title 登录");//改变标题 char username[20]; char userpas[20]; int i=2,j,k,n,m=0; char hit=0; do { system("cls"); printf("\n\n\n\n\n\n\t\t\t\t_____________________________________________\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 登录界面 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 请输入用户名: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 请输入密 码: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t|____________________________________________|\n"); COORD login_name = { 57, 10 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), login_name);//改变光标位置 scanf("%s",&username); strcpy(gName,username); COORD change_place = { 32, 16 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), change_place);//改变光标位置 printf("确认输入请按回车,重新输入请按ECS"); hit=getch();//暂停程序当i接收后继续下一条指令 for (;hit!=13&&hit!=27;)//保证只能是enter和ESC才能退出循环,输入其他字符无用,暂停程序,按'enter'继续。 { hit=getch(); } }while(hit==27); COORD login_pas = { 57, 12 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), login_pas);//改变光标位置 char key; while((key=_getch())!='\r')//如果没有输入回车 { if(m<19) { userpas[m++]=key; printf("*"); } else { printf("\n\n\n\n\n\t\t\t\t错误:密码超过字数限制!\n\t\t\t\t请重新登录!"); getch(); login(); } } i=match(username,userpas); if(i==1) { printf("\n\n\n\n\n\t\t\t\t登录成功!"); getch(); system("cls"); user_menu(); } else { if(i==-1) { printf("\n\n\n\n\n\t\t\t\t密码输入错误,请确认后重试."); getch(); print(); } if(i==0) { printf("\n\n\n\n\n\t\t\t\t不存在此用户,即将回到上一级."); getch(); print(); } } } int match(char a[20],char b[20])//检测文件中账号密码 和输入是否匹配 { FILE *fp; char username[20]; char userpas[20]; if((fp=fopen("user.txt","r"))==NULL) { system("cls"); printf("不存在相关资料,请创建用户"); getch(); system("cls"); //放入菜单按钮 } for(;!feof(fp);)//feof检测是否有结束符,如果有,返回0,没有返回非0 { fscanf(fp,"%s %s",&username,&userpas); if(strcmp(a,username)==0) { if(strcmp(b,userpas)==0) return 1; else return -1; } } return 0; } void user_menu()//用户界面 { system("title 共享单车租用系统"); system("cls"); printf("\n\n\t\t\t\t__________________________________________\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 用户界面 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 1.借用单车 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 2.查看可用单车 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 3.还车 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 4.充值 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 5.查看余额 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 6.修改密码 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 0.退出系统 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t|_________________________________________|\n"); userKey(); } void userKey()//用户选择 { printf("\t\t\t\t请输入:"); int choice=0; scanf("%d",&choice); switch(choice) { case 1: use_bike(); break; case 2: user_browseBike(); break; case 3: return_bike(); break; case 4: add_money(); break; case 5: check_money(); break; case 6: change_pas(); break; case 0: exit(1); break; default: user_menu(); break; } } void use_bike()//租车 { system("title 租车系统"); system("cls"); bNode head=NULL; bNode p,p1,p2; FILE *fp,*fp1,*fp2,*fp3; char username[20],name[20],sex[10], tel[12],_num[20]; char address[100]={'\0'},num[20]={'\0'},use_bike_num[20]={'\0'}; float price,makemoney,cost,money; int usetime,age,time; int n=0,m=0,j=0,q=0; char i; fp3=fopen("time.txt","r"); for(;!feof(fp3);) { fscanf(fp3,"%s%d",_num,&time); if(strcmp(_num,gName)==0) { printf("不能同时借两辆单车,请先结束使用单车!"); getch(); user_menu(); } } fclose(fp3); if((fp=fopen("bike.txt","r"))==NULL) { printf("未发现单车数据,请等待管理员添加."); printf("\n即将返回上一级..."); getch(); user_menu(); } else { fp=fopen("bike.txt","r"); n=num_bike(); if(n==0) { printf("单车被借光了,请等待其他用户结束使用."); printf("\n即将返回上一级"); getch(); user_menu(); } printf("请输入想要租借的单车编号:"); scanf("%s",use_bike_num); printf("\n确认租借请回车,取消请按Esc\n"); i=getch(); for(;i!=13&&i!=27;) i=getch(); if (i==27) user_menu(); for(m=0;m<n;m++) { fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime); if(strcmp(use_bike_num,num)==0) { fp2=fopen("Inform.txt","r"); fscanf(fp2,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money); if(money<price) { printf("余额不足,请充值后使用!"); getch(); add_money(); } else { q++; bike_money=price; fp1=fopen("use_bike.txt","a"); fprintf(fp1,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",num,price,makemoney,cost,address,usetime); fclose(fp1); } fclose(fp2); } if(strcmp(use_bike_num,num)) { j++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表 if(j==1)//建立链表 { p1=p2=(bNode)malloc(sizeof(Bike)); head=p1; } else { p2->next=p1; p2=p1; p1=(bNode)malloc(sizeof(Bike));//新建链表 } strcpy(p1->num,num);//复制单车信息 p1->price=price; p1->makemoney=makemoney; p1->cost=cost; strcpy(p1->address,address); p1->usetime=usetime; } } if (j==0)//如果单车只有一项且这一项刚好和要删除的相同 { head=NULL; } else//建立链表的最后剩余一个储存空间,所以封底 { p2->next=p1; p1->next=NULL; fclose(fp); } } fp=fopen("bike.txt","w");//清空文件 fclose(fp); fp=fopen("bike.txt","a");//追加文件 p=head; for (;p!=NULL;)//把链表内容覆盖到文件 { fprintf(fp,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",p->num,p->price,p->makemoney,p->cost,p->address,p->usetime); p=p->next; } free(p); fclose(fp); if(q==0) { printf("单车租借失败:编号错误!"); getch(); user_menu(); } else { system ("cls"); printf("租借成功! \n单车收费为每30分钟%.1f元\n",bike_money); printf("前3分钟不收取费用\n") ; printf("当前时间为:"); print_time(); get_time(); getch();//返回上一层 user_menu(); } } void print_time()//打印时间 { time_t timep; struct tm *p; time(&timep); p = localtime(&timep); //取得当地具体时间 printf("%d年 %d月 %d日 ", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday); printf("%d:%d:%d\n", p->tm_hour, p->tm_min, p->tm_sec); } void get_time()//获取当前时间并存入文件 { time_t timep; time(&timep); FILE*fp; if((fp=fopen("time.txt","r"))==NULL) { fp=fopen("time.txt","w"); fclose(fp); } fp=fopen("time.txt","a"); fprintf(fp,"%s\t%d\n",gName,timep); fclose(fp); } int num_bike()//统计单车信息 { FILE *fp; int n; char num[20],address[100]={'\0'}; int usetime=0; float price,makemoney=0,cost; fp=fopen("bike.txt","r"); for(n=0;!feof(fp);n++) fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime); n--; fclose(fp); return(n); } void user_browseBike()//浏览单车信息 { system("title 单车使用情况"); FILE *fp; int n=0,m=0; char num[15],address[100]; int usetime=0; float price,makemoney=0,cost; if ((fp=fopen("bike.txt","r"))==NULL)//打开文件 { system ("cls"); printf("\n数据不存在!即将返回上一级..."); getch(); user_menu(); } n=num_bike(); if(n==0) { system("cls"); printf("无任何信息!"); getch(); user_menu(); } fp=fopen("bike.txt","r"); system ("cls"); printf("单车编号\t单车价格/min\t单车赚取利润\t单车成本\t单车地址\t\t单车使用次数\n"); for(m=0;m<n;m++) { fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime); printf("%6s\t\t%.1f\t\t%.1f\t\t%.1f\t\t%s\t\t\t%d\n",num,price,makemoney,cost,address,usetime); } fclose(fp); printf("\n按任意键返回\n"); getch(); user_menu(); } void return_bike()//还车 { system("title 还车系统"); system("cls"); bNode head=NULL; bNode p,p1,p2; FILE *fp,*fp1,*fp2,*fp3; char username[20]={'\0'},name[20]={'\0'},sex[10]={'\0'},tel[12]={'\0'},_num[20]; int age,f=0,g=0; float money,pmoney,add_money; char address[100]={'\0'},num[20]={'\0'},use_bike_num[20]={'\0'}; float price,makemoney,cost; int usetime,usemin,time; int n=0,m=0,j=0,x=0; char i; fp3=fopen("time.txt","r"); for(;!feof(fp3);) { fscanf(fp3,"%s%d",_num,&time); if(strcmp(_num,gName)==0) { x++; } } fclose(fp3); if(x==0) { printf("您当前并未租用单车,无需还车."); printf("\n即将返回上一级..."); getch(); user_menu(); } if((fp=fopen("use_bike.txt","r"))==NULL) { printf("未发现租用数据,请确认后选择."); printf("\n即将返回上一级..."); getch(); user_menu(); } else { fp=fopen("use_bike.txt","r"); n=num_use_bike(); if(n==0) { printf("当前没有租用中的单车,请确认后继续."); printf("\n即将返回上一级"); getch(); user_menu(); } printf("请输入想要归还的单车编号:"); scanf("%s",use_bike_num); printf("\n确认归还请回车,取消请按Esc\n"); i=getch(); for(;i!=13&&i!=27;) i=getch(); if (i==27) user_menu(); for(m=0;m<n;m++) { fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime); if(strcmp(use_bike_num,num)==0) { g++; bike_money=price; system ("cls"); printf("归还成功! \n单车收费为每30分钟%.1f元\n",bike_money); printf("当前时间为:"); print_time(); usemin=calculate_time();//获取使用时间 printf("\n共使用%d分钟\n",usemin); money=calculate_money(usemin,bike_money);//获取花费金额 printf("花费金额为%.1f元",money); usetime=usetime+1;//使用次数+1 if(usetime>=20)//如果使用次数到20则检查维修一次,检查维修后使用次数置零 usetime=0; makemoney=makemoney+money;//收费加入单车赚取金额 fp1=fopen("bike.txt","a"); fprintf(fp1,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",num,price,makemoney,cost,address,usetime); fclose(fp1); delete_time(); fp2=fopen("Inform.txt","r+"); for(;strcmp(gName,username)!=0;)//获取用户位置 { fscanf(fp2,"%s%s%d%s%s%f",username,name,&age,sex,tel,&pmoney); } add_money=money; f=get_num(pmoney)+1; pmoney=pmoney-add_money; printf("\n当前余额为:%.1f",pmoney); fseek(fp2,-f,SEEK_CUR);//改变指针位置 fprintf(fp2,"%.1f",pmoney);//扣去费用 fclose(fp2); } if(strcmp(use_bike_num,num)) { j++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表 if(j==1)//建立链表 { p1=p2=(bNode)malloc(sizeof(Bike)); head=p1; } else { p2->next=p1; p2=p1; p1=(bNode)malloc(sizeof(Bike));//新建链表 } strcpy(p1->num,num);//复制单车信息 p1->price=price; p1->makemoney=makemoney; p1->cost=cost; strcpy(p1->address,address); p1->usetime=usetime; } } if (j==0)//如果单车只有一项且这一项刚好和要删除的相同 { head=NULL; } else//建立链表的最后剩余一个储存空间,所以封底 { p2->next=p1; p1->next=NULL; fclose(fp); } } fp=fopen("use_bike.txt","w");//清空文件 fclose(fp); fp=fopen("use_bike.txt","a");//追加文件 p=head; for (;p!=NULL;)//把链表内容覆盖到文件 { fprintf(fp,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",p->num,p->price,p->makemoney,p->cost,p->address,p->usetime); p=p->next; } free(p); fclose(fp); if(g==0) { system("cls"); printf("还车失败:编号错误!"); printf("\n请确认单车编号后重试!"); getch(); user_menu(); } getch();//返回上一层 user_menu(); } int num_use_bike()//统计使用中的单车个数 { FILE *fp; int n; char num[20],address[100]={'\0'}; int usetime; float price,makemoney,cost; fp=fopen("use_bike.txt","r"); for(n=0;!feof(fp);n++) fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime); n--; fclose(fp); return(n); } int calculate_time()//计算使用时间 { int utime=0,usesec=0; char name[20]={'\0'}; time_t timep; time(&timep); FILE*fp; fp=fopen("time.txt","r"); for(;!feof(fp);) { fscanf(fp,"%s %d",name,&utime); if(strcmp(name,gName)==0) { usesec=timep-utime; usesec=usesec/60; } } return usesec; } int get_num(float data)//统计余额位数 { float num; int i=0; for(;data>=10;) { data=data/10; i++; } i=i+2; return i; } float calculate_money(int data,float money)//计算用户花费金额 { data=data-3; int i=0; float m; i=data/30; if(data%30>=0) i=i+1; m=i*money; return m; } void delete_time()//删除用完的时间 { char num[20]; int time,n; tNode head=NULL; tNode p,p1,p2; FILE *fp; fp=fopen("time.txt","r+"); for(;!feof(fp);) { fscanf(fp,"%s %d",num,&time); if(strcmp(num,gName)) { n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表 if(n==1)//建立链表 { p1=p2=(tNode)malloc(sizeof(Time)); head=p1; } else { p2->next=p1; p2=p1; p1=(tNode)malloc(sizeof(Time));//新建链表 } strcpy(p1->num,num);//复制单车信息 p1->time; } } if (n==0)//如果单车只有一项且这一项刚好和要删除的相同 { head=NULL; } else//建立链表的最后剩余一个储存空间,所以封底 { p2->next=p1; p1->next=NULL; fclose(fp); } fp=fopen("time.txt","w");//清空文件 fclose(fp); fp=fopen("time.txt","a");//追加文件 p=head; for (;p!=NULL;)//把链表内容覆盖到文件 { fprintf(fp,"%s\t%d\n",p->num,p->time); p=p->next; } free(p); fclose(fp); } void add_money()//充值系统 { system("title 充值系统"); system("cls"); FILE*fp; char username[20]={'\0'},name[20]={'\0'},sex[10]={'\0'},tel[12]={'\0'}; int age; float money,add_money; int p=0; fp=fopen("Inform.txt","r+"); for(;strcmp(gName,username)!=0;) { fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money); } p=get_num(money)+1; printf("请输入充值金额:"); scanf("%f",&add_money); money=money+add_money; fseek(fp,-p,SEEK_CUR); fprintf(fp,"%.1f",money); fclose(fp); printf("\n充值成功!当前余额为:%.1f",money); getch(); user_menu(); } void check_money()//查看余额 { system("title 充值系统"); system("cls"); FILE*fp; char username[20]={'\0'},name[20]={'\0'},sex[10]={'\0'},tel[12]={'\0'},lookup[20]={'\0'}; int age; float money,add_money; int n=0,m=0,p=0; fp=fopen("Inform.txt","r+"); for(;strcmp(gName,username)!=0;) { fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money); } printf("当前余额为:%.1f",money); printf("\n按任意键返回上一级..."); getch(); user_menu(); } void change_pas()//更改密码 { system("title 创建账号");//改变标题 FILE *fp; int hit,p=0; char username[20]; char userpas[20],userpas1[20]; system("cls"); fp=fopen("user.txt","r+");//打开user.txt可读写 for(;strcmp(gName,username)!=0;)//定位指针 { fscanf(fp,"%s%s",username,userpas); } p=strlen(userpas); fseek(fp,-p,SEEK_CUR); printf("新密码需与原密码长度一致."); getch(); system("cls"); for(;;) { printf("\n\n\n\n\n\n\t\t\t\t_____________________________________________\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 修改密码 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 请输入新密码: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 再次确认密码: |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t|____________________________________________|\n"); COORD change_pas = { 57, 10 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), change_pas);//改变光标位置 char key; int i=0,j=0; while((key=_getch())!='\r')//如果没有输入回车 { if(i<19) { userpas[i++]=key;//每输入一个字符,打印一个*,让密码不可见 printf("*"); } else { COORD sin_pas_too_long = { 28, 12 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_too_long); printf("\n\n\n\n\n\t\t\t\t密码过长!\n\t\t\t\t请重新输入!"); getch(); } } COORD change_pas_again = { 57, 12 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), change_pas_again);//改变光标位置 while((key=_getch())!='\r')//如果没有输入回车 { if(j<19) { userpas1[j++]=key; printf("*"); } else { COORD sin_pas_again_too_long = { 28, 16 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_again_too_long); printf("\n\n\n\n\n\t\t\t\t密码过长!\n\t\t\t\t请重新输入!"); getch(); } } if(strcmp(userpas,userpas1)==0)//对比两次输入密码是否一致 { fprintf(fp,"%s",userpas); break; } else { COORD sin_pas_error = { 28, 16 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_error); printf("两次密码不一致,请重新输入,退出请按ESC"); hit=getch(); if(hit=27) ; system("cls"); } } fclose(fp); COORD sin_up_sucess = { 32, 16 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_sucess); printf("更改成功,按任意键返回"); getch(); user_menu(); } void manage_menu()//管理员菜单 { system("title 共享单车管理系统"); system("cls"); printf("\n\n\t\t\t\t__________________________________________\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 管理界面 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 1.添加单车 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 2.浏览用户信息 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 3.单车使用情况 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 4.查找信息 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 5.删除单车 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 6.资金流动情况 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t| 0.退出系统 |\n"); printf("\t\t\t\t| |\n"); printf("\t\t\t\t|_________________________________________|\n"); keyDown(); } void keyDown()//对管理员菜单的选择 { printf("\t\t\t\t请输入:"); int choice=0; scanf("%d",&choice); switch(choice) { case 1: add_bike(); break; case 2: browseUser(); break; case 3: browseBike(); break; case 4: lookup_choice(); break; case 5: delete_bike(); break; case 6: calculate(); break; case 0: exit(1); break; default: manage_menu(); break; } } void add_bike()//添加单车 { system("title 添加单车"); FILE*fp; char i; char num[15],_num[15],address[100]={'\0'},_address[100]; int usetime=0,_usetime; float price,_price,cost,_cost,_makemoney; system("cls"); if ((fp= fopen("bike.txt","r"))==NULL) { fp=fopen("bike.txt","w"); fclose(fp); } for(;i!=27;) { printf("请输入单车编号:"); scanf("%s",&num); fopen("bike.txt","r"); for(;!feof(fp);) { fscanf(fp,"%s%f%f%f%s%d",_num,&_price,&_makemoney,&_cost,_address,&_usetime); if(strcmp(num,_num)==0) { printf("已存在该编号单车,请尝试其它编号."); getch(); add_bike(); } } printf("\n请输入单车单价:"); scanf("%f",&price); printf("\n请输入单车成本:"); scanf("%f",&cost); printf("\n请输入单车位置:"); scanf("%s",&address); float makemoney=0; makemoney=makemoney-cost; fp=fopen("bike.txt","a"); fprintf(fp,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",num,price,makemoney,cost,address,usetime); printf("继续输入请按回车,结束输入请按ESC"); i=getch();//暂停程序当i接收后继续下一条指令 system("cls"); for(;i!=13&&i!=27;)//保证只能是enter和ESC才能退出循环,输入其他字符无用,暂停程序,按'enter'继续。 i=getch(); } fclose(fp); manage_menu(); } void delete_bike()//删除单车 { system("title 删除单车"); bNode head=NULL; bNode p,p1,p2; char address[100]={'\0'},num[20]={'\0'},lookup[20]={'\0'}; char i; int n=0,j=0,k=0,f=0; int usetime; float price,makemoney,cost; FILE*fp; if((fp=fopen("bike.txt","r"))==NULL) { system("cls"); printf("数据不存在,请确认相关信息!"); printf("\n即将返回上一级..."); getch(); manage_menu(); } else { system("cls"); fopen("bike.txt","r"); j=num_bike(); if(j==0) { system("cls"); printf("无任何单车信息!"); printf("\n即将返回上一级..."); getch(); manage_menu(); } printf("请输入想要删除的单车编号:"); scanf("%s",lookup); printf("\n确认删除请回车,取消请按Esc\n"); i=getch(); for(;i!=13&&i!=27;) i=getch(); if (i==27) manage_menu(); for(k=0;k<j;k++) { fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime); if(strcmp(lookup,num)==0)//判断是否存在该编号单车 { f++; } if(strcmp(lookup,num)) { n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表 if(n==1)//建立链表 { p1=p2=(bNode)malloc(sizeof(Bike)); head=p1; } else { p2->next=p1; p2=p1; p1=(bNode)malloc(sizeof(Bike));//新建链表 } strcpy(p1->num,num);//复制单车信息 p1->price=price; p1->makemoney=makemoney; p1->cost=cost; strcpy(p1->address,address); p1->usetime=usetime; } } if (n==0)//如果单车只有一项且这一项刚好和要删除的相同 { head=NULL; } else//建立链表的最后剩余一个储存空间,所以封底 { p2->next=p1; p1->next=NULL; fclose(fp); } } fp=fopen("bike.txt","w");//清空文件 fclose(fp); fp=fopen("bike.txt","a");//追加文件 p=head; for (;p!=NULL;)//把链表内容覆盖到文件 { fprintf(fp,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",p->num,p->price,p->makemoney,p->cost,p->address,p->usetime); p=p->next; } free(p); fclose(fp); if(f==0) { printf("\n删除失败:不存在该编号单车!"); getch(); manage_menu(); } else { printf("\n删除成功 \n按任意键返回上一层\n"); getch();//返回上一层 manage_menu(); } } void lookup_choice()//查找信息 { system("选择界面"); system("cls"); int choice=0; printf("请输入查找选项:\n1.查找单车.\n2.查找用户.\n0.返回上一级\n"); printf("请输入:"); scanf("%d",&choice); switch(choice) { case 1: lookup_bike(); break; case 2: lookup_user(); break; case 0: manage_menu(); break; default: system("cls"); printf("请输入数字1-3!"); getch(); lookup_choice(); break; } } void lookup_bike()//查找单车信息 { system("title 查找单车"); system("cls"); FILE*fp; char address[100]={'\0'},num[20]={'\0'},lookup[100]={'\0'}; int n=0,m=0,p=0; int usetime; float price,makemoney,cost; if((fp=fopen("bike.txt","r"))==NULL) { system("cls"); printf("数据不存在,请确认相关信息!"); printf("\n即将返回上一级..."); getch(); manage_menu(); } fp=fopen("bike.txt","r"); n=num_bike(); if(n==0) { system("cls"); printf("无任何单车信息!"); printf("\n即将返回上一级..."); getch(); manage_menu(); } printf("请输入单车地址或编号:"); scanf("%s",lookup); system("cls"); for(m=0;m<n;m++) { fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime); if(!strcmp(lookup,address)||!strcmp(lookup,num)) { if(p==0) { printf("查询结果:\n"); printf("单车编号\t单车价格/min\t单车赚取利润\t单车成本\t单车地址\t\t单车使用次数\n"); } printf("%6s\t\t%.1f\t%.1f\t%.1f\t%s\t\t\t%d\n",num,price,makemoney,cost,address,usetime); p++; getch(); } } if(p==0) { system("cls"); printf("无符合记录!"); printf("\n即将返回上一级..."); getch(); manage_menu(); } fclose(fp); manage_menu(); } void lookup_user()//查找用户信息 { system("title 查找用户"); system("cls"); FILE*fp; char username[20]={'\0'},name[20]={'\0'},sex[10]={'\0'},tel[12]={'\0'},lookup[20]={'\0'}; int age; float money; int n=0,m=0,p=0; if((fp=fopen("Inform.txt","r"))==NULL) { system("cls"); printf("数据不存在,请确认相关信息!"); printf("\n即将返回上一级..."); getch(); manage_menu(); } fp=fopen("Inform.txt","r"); printf("请输入用户名或姓名/电话:"); scanf("%s",lookup); system("cls"); n=num_user(); if(n==0) { system("cls"); printf("无任何用户信息!"); printf("\n即将返回上一级..."); getch(); manage_menu(); } for(m=0;m<n;m++) { fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money); if(!strcmp(lookup,username)||!strcmp(lookup,name)||!strcmp(lookup,sex)||!strcmp(lookup,tel)) { printf("查询结果:\n"); printf("用户名\t\t姓名\t年龄\t性别\t电话\t\t余额\n"); printf("%s\t%s\t%d\t%s\t%s\t%.1f\n",username,name,age,sex,tel,money); getch(); p++; } } if(p==0) { system("cls"); printf("无符合记录!"); printf("\n即将返回上一级..."); getch(); manage_menu(); } fclose(fp); manage_menu(); } int num_user()//统计用户信息 { FILE *fp; int n; char username[20],name[20],sex[10],tel[12]; int age; float money; fp=fopen("Inform.txt","r"); for(n=0;!feof(fp);n++) fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money); n--; fclose(fp); return(n); } void browseUser()//浏览用户信息 { system("title 浏览用户信息"); FILE *fp; int n=0,m=0; char username[20],name[20],sex[10],tel[12]; int age; float money; if ((fp=fopen("Inform.txt","r"))==NULL)//打开文件 { system ("cls"); printf("\n数据不存在!即将返回上一级..."); getch(); manage_menu(); } n=num_user(); if(n==0) { system("cls"); printf("无任何信息!"); getch(); manage_menu(); } fp=fopen("Inform.txt","r"); system ("cls"); printf("用户名\t\t姓名\t\t年龄\t性别\t电话\t\t余额\n"); for(m=0;m<n;m++) { fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money); printf("%s\t\t%s\t\t%d\t%s\t%s\t%.1f\n",username,name,age,sex,tel,money); } fclose(fp); printf("\n按任意键返回\n"); getch(); manage_menu(); } void browseBike()//浏览单车信息 { system("title 单车使用情况"); FILE *fp; int n=0,m=0; char num[15],address[100]; int usetime=0; float price,makemoney=0,cost; if ((fp=fopen("bike.txt","r"))==NULL)//打开文件 { system ("cls"); printf("\n数据不存在!即将返回上一级..."); getch(); manage_menu(); } n=num_bike(); if(n==0) { system("cls"); printf("无任何信息!"); getch(); manage_menu(); } fp=fopen("bike.txt","r"); system ("cls"); printf("单车编号\t单车价格/min\t单车赚取利润\t单车成本\t单车地址\t\t单车使用次数\n"); for(m=0;m<n;m++) { fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime); printf("%6s\t\t%.1f\t\t%.1f\t\t%.1f\t\t%s\t\t\t%d\n",num,price,makemoney,cost,address,usetime); } fclose(fp); printf("\n按任意键返回\n"); getch(); manage_menu(); } float calculate()//资金流动情况 { system("title 资金流动情况"); system("cls"); float calculate,calculate1; FILE *fp; //单车的读取和计算 char address[100],num[20]; int n=0,m=0,j=0,k=0; int usetime; float price,makemoney,cost;//单车的资金计算 if ((fp=fopen("bike.txt","r"))==NULL) { system("cls"); printf("没有单车数据,当前无法盈利!\n"); printf("即将返回上一级..."); getch(); manage_menu(); } n=num_bike(); if(n==0) { system("cls"); printf("无任何单车信息!"); getch(); manage_menu(); } fp=fopen("bike.txt","r"); for(m=0;m<n;m++) { fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime); calculate=calculate+makemoney; } printf("单车赚取利润为:\t\t%.1f",calculate); fclose(fp); getch(); //用户数据读取和计算 char username[20],name[20],sex[10],tel[12]; int age; float money; if ((fp=fopen("Inform.txt","r"))==NULL)//打开文件 { system ("cls"); printf("无法找到用户数据!\n"); printf("即将返回上一级..."); getch(); manage_menu(); } j=num_user(); if(j==0) { system("cls"); printf("没有任何用户信息!"); getch(); printf("\n总共盈损:\t\t%.1f",calculate) ; getch(); manage_menu(); } fp=fopen("Inform.txt","r"); for(k=0;k<j;k++) { fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money); calculate1=calculate1+money; } printf("\n来自用户的利润为:\t%.1f",calculate1); getch(); printf("\n总共盈损:\t\t%.1f",calculate+calculate1); getch(); printf("\n即将返回上一级..."); getch(); manage_menu(); } int main() { print(); return 0; }
做下来这一个项目,参考了很多大佬的博客,有些东西我也解释不明白,贴下来我参考的文章,大家一起学习。
c语言:图书馆管理系统 //大部分是根据这位大佬的改编
https://blog.csdn.net/baidu_38760069/article/details/81014621
C语言利用链表与文件实现登录注册
https://blog.csdn.net/u011463794/article/details/82710787#comments
C/C++文件读写操作——FILE*、fstream、windowsAPI
https://blog.csdn.net/qq_15821725/article/details/78929344
C语言中fread(),fwrite(),fseek()用法和功能
https://blog.csdn.net/chichoxian/article/details/53458197
控制台光标(二):设置光标位置
https://blog.csdn.net/nocomment_84/article/details/53995015
消灭编译警告(Warning) //编译出现错误,这篇博文很有用
https://blog.csdn.net/myaccella/article/details/7003188
- 点赞 1
- 收藏
- 分享
- 文章举报
- c语言创建写入和读取TXT文件数据
- C++学习--向txt文件写入数据、读取数据、获取行数以及删除文件
- C语言通用数据管理系统(含文件操作)
- C语言通过单项链表以及文件的写入而写成的学生信息管理系统
- 如何用服务器文件管理系统记录共享文件的访问日志、记录共享文件复制、修改、删除和剪切等操作?
- java读写properties文件,解决系统找不到指定路径,解决写入后读取正常,但文件数据未更新问题
- 从文件读取内容,删除一个数据,把删除后的数据重新写入到文件
- [置顶] c语言文件读取 学生成绩管理系统的设计与实现
- C语言创建一个文件,写入数据并换行,再依次读取每行的数据,将读取的行数据以一定的格式命名为另一文件的文件名
- Hadoop文件系统操作之读取写入数据
- C语言中把结构内容写入二进制文件及从二进制文件中读取出数据
- 用C语言实现一个学生成绩管理系统 实现学生信息管理。包括:录入、查询、排序等功能。 要求: 用数据文件保存学生基本信息(学号 姓名 课程1 课程2 课程3…) ,利用菜单可以循环实现各个功能。
- 创建、写入、读取、删除 Plist 文件中数据
- c语言创建写入和读取TXT文件数据
- 【UWP通用应用开发】文件选取器、获取文件属性、写入和读取、保存读取和删除应用数据
- 文件系统管理 之 有关ext2文件系统下反删除(Undelete)操作恢复数据的文档
- Python 创建、读取和写入文件以及yield关键字- 千月的python linux 系统管理指南学习笔记(14)
- 【LWei】SpringMVC+File实现文件管理(内容写入、内容读取、文件删除、文件上传、文件下载)
- c语言读取文件夹中的各个文件名,并删除相应的文件
- [转]Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)