课设银行管理系统出现的一个小问题 求大神指导

#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++;
}

修改完后重新编译运行程序,查看结果是否正确。