2201_76114441 2022-12-29 22:00 采纳率: 100%
浏览 36
已结题

关于#c语言#的问题:输入两个及以上账户信息时,读出来的信息只有最后一个准确,其他会产生乱码#include <stdio.h>

写了一个开户的代码,用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);
    }
}



  • 写回答

1条回答 默认 最新

  • 浪客 2022-12-29 22:13
    关注

    函数中改变指针执行要用指针的指针传变量,不然函数中对指针指向的修改带不出函数。

    void iniData(BA **bac)
    {
      * bac = (BA *)malloc(number * sizeof(BA));
    }
    
    调用
    iniData(&bac);
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 已采纳回答 12月30日
  • 创建了问题 12月29日

悬赏问题

  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入