要求:
1. 登录:输入账号、密码正确才能进入菜单系统,输入3次错误则退出系统
2. 菜单:含有(1)查询余额、(2)取款、(3)存款、(4)改密、(5)退卡
关于要使用的文件如何布局:
1.每条独立的信息单独一行
2.在密码、金额一行,右边需要许多空格(因为用的是“r+”打开模式,用空格可以填充字符)
3.下方图片中为演示布局,每3行为一个用户的信息(账户、密码、余额),另外红线表示有空格+一个回车
4.特别注意:如果在文件反复几次回车,可能一行会有几个换行符。一定要确保一行只有一个回车
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{FILE* fpr;double balance,tempmoney;//余额、临时存储的金额char account[20],key[20];//用户输入的账号、密码char systemaccount[100] = {0},systemkey[100] = {0},useless[100] = {0};//系统中存储的账户、密码、无用的信息char sign = 0;//登录成功与否的标志,1表示登录成功,0表示失败unsigned function;//菜单功能选项int i,j;//循环计数变量int locationkey,locationbalance;//密码在文件中的位置、余额在文件中的位置//----------------------------------------------------if((fpr = fopen("I:\\cstudy\\bank\\bank.txt","r+")) == NULL){printf("系统发生错误,正在维护中\n");exit(0);}for(i = 0;i<3;i++){fflush(stdin);printf("请输入账号:");scanf("%s",account);printf("\n请输入密码:");scanf("%s",key);while((fgets(systemaccount,99,fpr)) != NULL){for(j = 0;*(systemaccount+j);j++)//去除文件中存储账号一行的换行符,如果按照二进制打开,要去除'\r''\n'{if(*(systemaccount+j) == '\n'){*(systemaccount+j) = '\0';}}locationkey = ftell(fpr);//返回密码在文件中的位置fscanf(fpr,"%s",systemkey);fgets(useless,99,fpr);//跳过空格locationbalance = ftell(fpr);//返回余额在文件中的位置fgets(useless,99,fpr);//跳过余额,因为登录只需要账号和密码if(strcmp(account,systemaccount) == 0 && strcmp(key,systemkey) == 0)//当账户密码与系统中的账户密码一致{printf("登录成功\n");sign = 1;break;}}if(sign == 0)//当没有与用户输入的账户及密码匹配时{printf("账号或者密码错误!\n您还有%d次输入机会\n",2-i);if(i == 2)//i = 2时,说明用户已经输入了3次{printf("您已经3次输入错误,您的账户已被冻结,在冻结期内禁止登录!\n");exit(1);}}else{break;//退出登录系统,进入菜单系统}}//-------------------------------------------------------------do{printf("\n\n菜单: \n");printf("(1) 查询余额 \n");printf("(2) 取款 \n");printf("(3) 存款 \n");printf("(4) 修改密码 \n");printf("(5) 退卡 \n");scanf("%d",&function);switch(function){case 1:{fseek(fpr,locationbalance,SEEK_SET);//将文件指针移动到余额位置fscanf(fpr,"%lf",&balance);printf("您的余额为:%.3f\n",balance);break;}case 2:{fseek(fpr,locationbalance,SEEK_SET);fscanf(fpr,"%lf",&balance);printf("请输入金额:\n");scanf("%lf",&tempmoney);if(tempmoney < balance)//想要取的钱小于余额时{balance -= tempmoney;printf("取款成功!\n");fseek(fpr,locationbalance,SEEK_SET);fprintf(fpr,"%-10.3lf",balance);}else{printf("您的余额不足!\n");}break;}case 3:{fseek(fpr,locationbalance,SEEK_SET);fscanf(fpr,"%lf",&balance);printf("请输入金额:\n");scanf("%lf",&tempmoney);balance += tempmoney;printf("存款成功!\n");fseek(fpr,locationbalance,SEEK_SET);fprintf(fpr,"%-10.3lf",balance);break;}case 4:{fseek(fpr,locationkey,SEEK_SET);//将文件指针移动到密码位置printf("请输入新密码:\n");scanf("%s",key);fprintf(fpr,"%-20s",key);printf("修改密码成功!\n");break;}case 5:{printf("已经退出成功!\n");exit(1);}}}while(sign);//此时sign = 1fclose(fpr);return 0;
}
使用软件:code::block
运行结果:
运行后的文件: