#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define Max_User 2000
struct record
{
int account_number;
int password;
char name[10];
float balance;
int status;
};
struct record user[Max_User];
int actual_user=0;
void readData();
void welcome_choose();
void writeData();
void account_information();
void admin_choose();
int admin_menu();
void all_account();
void check_balance();
void freeze();
int welcome_menu();
void openaccount();
int safe_password();
void save_money();
int search(int id);
void unfreeze();
void user_choose();
int user_menu();
void withdraw();
int main()
{
readData();
welcome_choose();
writeData();
return 0;
}
void readData()
{
FILE* fp ;
fp= fopen("account.txt", "a+");
int i = 0;
if (fp == NULL)
{
printf("Fileed to read data!\n");
exit(0);
}
else
{
while (fscanf(fp, "%d %s %d %lf %d", &user[i].account_number, user[i].name, &user[i].password, &user[i].balance, &user[i].status)==EOF)
{
i++;
}
fclose(fp);
actual_user = i;
}
return;
}
int welcome_menu()
{
int choose;
while (1)
{
printf("****************************\n");
printf("* 欢迎使用银行管理系统 *\n");
printf("* *\n");
printf("* 1.开户 *\n");
printf("* 2.用户登录 *\n");
printf("* 3.管理员登录 *\n");
printf("* 0.退出系统 *\n");
printf("* *\n");
printf("****************************\n");
scanf_s("%d", &choose);
if (choose < 0 || choose>3)
{
printf("输入错误,请重新输入\n");
}
else
{
break;
}
}
return choose;
}
void welcome_choose()
{
int choose;
int judge = 1;
while (1)
{
choose = welcome_menu();
switch (choose)
{
case 1:openaccount();
break;
case 2:user_choose();
break;
case 3:admin_choose();
break;
case 0:printf("欢迎您再来\n");
judge=0;
break;
}
if(judge==0)
{
break;
}
}
}
void openaccount()
{
int Password_1;
int Password_2;
if (actual_user == Max_User)
{
printf("人数已达最大上限,不能开户\n");
}
printf("正在开户......\n");
user[actual_user].account_number = 1001 + actual_user;
printf("账户:%d\n", user[actual_user].account_number);
printf("请输入姓名:\n");
scanf_s("%s", user[actual_user].name);
printf("请输入密码:\n");
Password_1 = safe_password();
printf("\n");
printf("请确认密码:\n");
Password_2 = safe_password();
printf("\n");
if (Password_1 == Password_2)
{
user[actual_user].password = Password_1;
actual_user+=1;
printf("请输入存款金额:\n");
fflush(stdin);
scanf_s("%lf", &user[actual_user].balance);
printf("%lf",user[actual_user].balance);
user[actual_user].status = 1;
printf("开户成功!\n");
}
else
{
printf("两次密码输入不一致,开户失败!\n");
}
fflush(stdin);
return;
}
int user_menu()
{
int choose;
while (1)
{
printf("****************************\n");
printf("* 欢迎使用银行管理系统 *\n");
printf("* *\n");
printf("* 1.查询余额 *\n");
printf("* 2.存款 *\n");
printf("* 3.取款 *\n");
printf("* 0.退出系统 *\n");
printf("* *\n");
printf("****************************\n");
scanf_s("%d", &choose);
if (choose >= 0 && choose <= 3)
{
break;
}
else
{
printf("输入错误,请重新输入\n");
}
}
return choose;
}
void user_choose()
{
int choose;
choose = user_menu();
switch (choose)
{
case 1:check_balance();
break;
case 2:save_money();
break;
case 3:withdraw();
break;
case 0:printf("欢迎您再来!\n");
break;
}
return;
}
void check_balance()
{
int id;
int who;
int password;
int temp=0;
printf("请输入您的账号:\n");
scanf_s("%d", &id);
who = search(id);
if (who < 0)
{
printf("很抱歉,没有找到你的信息,请核对后重试!\n");
}
else
{
while(1)
{
if(temp<3)
{
printf("%d\n", user[who].account_number);
printf("请输入密码:\n");
scanf_s("%d",&password);
if(password==user[who].password )
{
printf("姓名: ");
printf("%s", user[who].name);
printf("余额: ");
printf("%.2f\n", user[who].balance);
break;
}
else
{
printf("密码错误,请重新输入:\n");
temp++;
}
}
else
{
user[who].status=0;
break;
}
}
}
return;
}
void save_money()
{
int id;
int who;
float money;
int password;
int temp=0;
printf("请输入您的账号:\n");
scanf_s("%d", &id);
who = search(id);
if (who < 0)
{
printf("很抱歉,没有找到你的信息,请核对后重试!\n");
}
else
{
while(1)
{
if(temp<3)
{
printf("%d\n", user[who].account_number);
printf("请输入密码:\n");
scanf_s("%d",&password);
if(password==user[who].password )
{
printf("姓名: ");
printf("%s\n", user[who].name);
printf("余额: ");
printf("%.2f\n", user[who].balance);
if(user[who].status==1)
{
printf("请输入要存款金额:");
scanf_s("%f", &money);
user[who].balance += money;
printf("存款后余额为:%.2f\n", user[who].balance);
}
else
{
printf("您的账户处于冻结状态!\n");
}
break;
}
else
{
printf("密码错误,请重新输入:\n");
temp++;
}
}
else
{
user[who].status =0;
break;
}
}
}
return;
}
void withdraw()
{
int id;
int who;
float money;
int password;
int temp=0;
printf("请输入您的账号:\n");
scanf_s("%d", &id);
who = search(id);
if (who < 0)
{
printf("很抱歉,没有找到你的信息,请核对后重试!\n");
}
else
{
while(1)
{
if(temp<3)
{
printf("%d\n", user[who].account_number);
printf("请输入密码:\n");
scanf_s("%d",&password);
if(password==user[who].password )
{
printf("姓名: ");
printf("%s\n", user[who].name);
printf("余额: ");
printf("%.2f\n", user[who].balance);
if(user[who].status==1)
{
printf("请输入要取款金额:");
scanf_s("%f", &money);
user[who].balance -= money;
printf("存款后余额为:%.2f\n", user[who].balance);
}
else
{
printf("您的账户处于冻结状态!\n");
}
break;
}
else
{
printf("密码错误,请重新输入:\n");
temp++;
}
}
else
{
user[who].status =0;
break;
}
}
}
return;
}
int admin_menu()
{
int choose;
while (1)
{
printf("****************************\n");
printf("* 欢迎使用银行管理系统 *\n");
printf("* *\n");
printf("* 1.查询余额 *\n");
printf("* 2.存款 *\n");
printf("* 3.取款 *\n");
printf("* 4.查看所有账户 *\n");
printf("* 5.查询账户信息 *\n");
printf("* 6.冻结账户 *\n");
printf("* 7.解冻账户 *\n");
printf("* 0.退出系统 *\n");
printf("* *\n");
printf("****************************\n");
scanf_s("%d", &choose);
if (choose >= 0 && choose <= 7)
{
break;
}
else
{
printf("输入错误,请重新输入\n");
}
}
return choose;
}
void admin_choose()
{
int choose;
choose = admin_menu();
switch (choose)
{
case 1:check_balance();
break;
case 2:save_money();
break;
case 3:withdraw();
break;
case 4:all_account();
break;
case 5:account_information();
break;
case 6:freeze();
break;
case 7:unfreeze();
break;
case 0:printf("欢迎您再来!\n");
break;
}
return;
}
void all_account()
{
int i;
for (i = 0; i < actual_user; i++)
{
printf("%d %s %d %.2f %d", user[i].account_number, user[i].name, user[i].password, user[i].balance, user[i].status);
}
return;
}
void account_information()
{
int id;
int who;
scanf_s("%d", &id);
who = search(id);
if (who < 0)
{
printf("该账户不存在!\n");
}
else
{
printf("%d", user[who].account_number);
printf("姓名:%s\n", user[who].name);
printf("密码:%d\n", user[who].password);
printf("余额:%.2f\n", user[who].balance);
if (user[who].status == 0)
{
printf("状态:冻结!\n");
}
if (user[who].status == 1)
{
printf("状态:正常!\n");
}
}
return;
}
void freeze()
{
int id;
int who;
scanf_s("%d", &id);
who = search(id);
if (who < 0)
{
printf("该账户不存在!\n");
}
else
{
if (user[who].status == 0)
{
printf("该账户已处于冻结状态!\n");
}
else
{
user[who].status = 0;
printf("冻结该账户成功!\n");
}
}
return;
}
void unfreeze()
{
int id;
int who;
scanf_s("%d", &id);
who = search(id);
if (who < 0)
{
printf("该账户不存在!\n");
}
else
{
if (user[who].status == 1)
{
printf("该账户状态正常,无需进行操作!\n");
}
if (user[who].status == 0)
{
user[who].status = 1;
printf("解冻成功!\n");
}
}
return;
}
int safe_password()
{
char ch;
int safe_password = 0;
int i;
while (1)
{
for (i = 0; i < 6; i++)
{
ch = getch();
printf("*");
if (isdigit(ch))
{
safe_password = safe_password * 10 + (ch - '0');
}
else
{
safe_password = 0;
break;
}
}
fflush(stdin);
if (safe_password == 0)
{
printf("密码要求全为数字,且不全为0\n");
printf("请重新输入:\n");
}
else
{
break;
}
}
return safe_password;
}
int search(int id)
{
int max = actual_user - 1;
int min = 0;
int mid;
int who = -1;
while (1)
{
mid = (min + max) / 2;
if (user[mid].account_number == id)
{
who = mid;
break;
}
else
{
if (user[mid].account_number < id)
{
min = mid + 1;
}
if (user[mid].account_number > id)
{
max = mid - 1;
}
}
}
return who;
}
void writeData()
{
FILE* fp = fopen("account.txt", "w");
int i = 0;
if (fp == NULL)
{
printf("Fileed to read data!\n");
exit(0);
}
else
{
while (fprintf(fp, "%d %s %d %lf %d", user[i].account_number, user[i].name, user[i].password, user[i].balance, user[i].status)==EOF)
{
i++;
}
fclose(fp);
actual_user = i;
}
return;
}
这是一个银行管理系统
其中开户的时候出现了数据无法写入的问题
void openaccount() 就是这个函数里面的
参考GPT和自己的思路:
根据你提供的代码,问题可能出现在 readData()
函数和 writeData()
函数中。
在 readData()
函数中,你使用的是文件打开模式 a+
,这个模式的意思是追加写入,在文件末尾追加写入数据。但是,你在循环读取文件数据时使用了 EOF
判断循环结束,而 EOF
表示文件末尾,所以你的循环读取实际上没有执行。你需要改成使用 fscanf()
函数的返回值来判断循环结束,例如:
while (fscanf(fp, "%d %s %d %lf %d", &user[i].account_number, user[i].name, &user[i].password, &user[i].balance, &user[i].status) == 5)
{
i++;
}
在 writeData()
函数中,你使用了 fprintf()
函数来写入数据,但是你的格式控制字符串中没有包含换行符。在读取文件时你使用了 %d %s %d %lf %d
这样的格式控制字符串,没有换行符也是可以的,但是在写入文件时最好加上。例如:
while (fprintf(fp, "%d %s %d %lf %d\n", user[i].account_number, user[i].name, user[i].password, user[i].balance, user[i].status) == 5)
{
i++;
}
修改完后重新编译运行程序,查看结果是否正确。