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;elsereturn -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;//使用次數+1if(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
總結
以上是生活随笔為你收集整理的C语言 共享单车管理系统(读取、写入、删除文件中数据)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 人脸识别技术和人脸识别特征
- 下一篇: 关于计算机体系结构-北桥和南桥
