写了一个开户的代码,用fwrite写入信息,fread读出信息。输入两个及以上账户信息时,读出来的信息只有最后一个准确,其他会产生乱码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BankAccount {
int accountCard;//账户卡号
char accountName[10];//储户名字
char mobile[11];//手机号码
char cardId[18];//身份证
char password[6];// 密码
double money;//余额
} BA;
BA *bac;
int number;
void WriteData(BA *bac) {
FILE *fp;
if ((fp = fopen("account.txt", "wb")) == NULL) {
printf("\n\t打开文件失败!!\n");
exit(0);
}
fwrite(&number, sizeof(int), 1, fp);
//fseek(fp,sizeof(BA)*(number-1)*1l+sizeof(int),0);
fwrite(bac, sizeof(BA), number, fp);
fclose(fp);
}
void iniData(BA *bac) { //用于打开文件并初始化数据
FILE *fp;
int i;
if ((fp = fopen("account.txt", "rb")) == NULL) {
printf("\n\t打开文件失败!!\n");
exit(0);
}
fread(&number, sizeof(int), 1, fp);
bac = (BA *)malloc(number * sizeof(BA));
for (i = 0; i < number; i++) {
fread(&(bac[i]), sizeof(BA), 1, fp);
}
fclose(fp);
}
int main() {
int y = 0; //用于选择需要服务
int x = 0; //用于判断信息是否正确
while (1) {
printf("\n\t----------------------------------\n");
printf("\n\t请选择需要的服务: \n");
printf("\n\t \n");// ******************************
printf("\n\t 1.储户新开户 \n");//********此处可以调用函数******
printf("\n\t \n");// ******************************
printf("\n\t 0.退出 \n");
printf("\n\t----------------------------------\n");
//控制输入的内容只能是'0'和'1'
scanf("%d", &y);
if (y == 1) {
if (bac != NULL)
free(bac);
bac = (BA *)malloc((number + 1) * sizeof(BA));
}
if (y == 0) {
WriteData(bac);
free(bac);
break;
}
//现在执行储户新开户
while (1) {
printf("\n\t请输入新的储户开户信息:\n");
printf("\n\t姓名>>>");
scanf("%s", &bac[number].accountName);
printf("\n\t身份证号码 (18位)>>>");
scanf("%s", &bac[number].cardId);
printf("\n\t手机号码(11位)>>>");
scanf("%s", &bac[number].mobile);
printf("\n\t初始余额(100-20000)>>>");
scanf("%lf", &bac[number].money);
bac[number].accountCard = 80081 + number;
//将输入的身份证后六位作为初始密码保存
bac[number].password[0] = bac[number].cardId[1];
bac[number].password[1] = bac[number].cardId[2];
bac[number].password[2] = bac[number].cardId[3];
bac[number].password[3] = bac[number].cardId[4];
bac[number].password[4] = bac[number].cardId[5];
bac[number].password[5] = bac[number].cardId[6];
bac[number].password[6] = '\0';
//将当前输入的验证合法的储户信息保存到新开户的储户信息
//判断信息是否正确
printf("\n\t储户姓名 身份证号码 手机号码 初始余额\n");
printf("\t%s %s %s %lf\n",
bac[number].accountName, bac[number].cardId, bac[number].mobile, bac[number].money);
printf("\n\t若有错误,请按1,再按回车键;若正确,请按其它数字键,再按回车键!\n");
scanf("%4d", &x);
if (x == 1) {
continue;
} else {
printf("\n\t您的卡号:%d\n", bac[number].accountCard);
printf("\n\t您的初始密码:%s\n", bac[number].password);
number++;
break;
}
}
}
iniData(bac);
printf("\n\t卡号 姓名 身份证 手机号码 密码 余额\n");
for (int i = 0; i < number; i++) {
printf("\n\t%d %s %s %s %s %.2lf\n",
bac[i].accountCard,
bac[i].accountName,
bac[i].mobile,
bac[i].cardId,
bac[i].password,
bac[i].money);
}
}