要求:
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 = 1
fclose(fpr);
return 0;
}
使用软件:code::block
运行结果:
运行后的文件: