C++报错(corrupted)问题+运行问题

运行无报错 运行后操作过程中说‘Card_Number’ was corrupted

img

#include <iostream>
#include<fstream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int Card_Number = 0;
int UserNumber = 0;
struct User {
    char key[50];
    char Card_Number[20];
    char name[50];
    double money;
}user[100000];

void First_Menu() {
    printf("|--------------------------------------|\n");
    printf("                                        \n");
    printf("|         ATM机存取款管理系统          |\n");
    printf("                                        \n");
    printf("|--------------------------------------|\n");
    printf("                                        \n");
    printf("|                                      |\n");
    printf("              登录-------1              \n");
    printf("|                                      |\n");
    printf("                                        \n");
    printf("|--------------------------------------|\n");
}
void Login_Menu() {
    printf("|--------------------------------------|\n");
    printf("                                        \n");
    printf("|         欢迎您进入登录页面           |\n");
    printf("                                        \n");
    printf("|--------------------------------------|\n");
    printf("                                        \n");
    printf("                                        \n");
}
void Successfullogin_Menu() {
    printf("|--------------------------------------|\n");
    printf("                                        \n");
    printf("|         ATM机存取款管理系统          |\n");
    printf("                                        \n");
    printf("|--------------------------------------|\n");
    printf("                                        \n");
    printf("|                                      |\n");
    printf("              取款-------2              \n");
    printf("|                                      |\n");
    printf("           查询余额-------3             \n");
    printf("                                       |\n");
    printf("            更改密码-------4            \n");
    printf("                                       |\n");
    printf("              锁卡-------5              \n");
    printf("                                       |\n");
    printf("              退卡-------6              \n");
    printf("|--------------------------------------|\n");
}
void GetMoney_Menu() {
    printf("|--------------------------------------|\n");
    printf("                                        \n");
    printf("|                 取款                 |\n");
    printf("                                        \n");
    printf("|--------------------------------------|\n");
    printf("请注意取款金额勿超过20000(单笔最大金额)以及卡内余额!!");
}

void Save()          //更新用户信息(学习效仿csdn博主)
{
    FILE* fp = NULL;
    if ((fopen("D:\\C++\\Bank statistic.txt", "wb")) != NULL)
    {
        for (int i = 1; i <= UserNumber; i++)
        {
            fwrite(&user[i], sizeof(struct User), 1, fp);
        }
        fclose(fp);
    }
    else
    {
        printf("\n用户信息更新失败");
    }
}
void TiQu()         //提取用户信息(学习效仿csdn博主)
{
    UserNumber = 0;
    FILE* fp = NULL;
    if ((fp = fopen("D:\\C++\\Bank statistic.txt", "rb")) != NULL)
    {
        while (!feof(fp))
        {
            fread(&user[++UserNumber], sizeof(struct User), 1, fp);
        }
        fclose(fp);
    }
    else printf("\n用户信息加载失败");
    UserNumber--;
}
class Operation {
private:
    char Card_Number[50];
    char Card_Key[50];
public:
    Operation(const char* cardNumber, const char* cardKey) {
        strcpy_s(Card_Number, cardNumber);
        strcpy_s(Card_Key, cardKey);
    }
    void Login_Account() {
        int i = 0;
        char a[20] = {};
        char b[20] = {};
        int count = 0;

        std::ifstream fp;
        fp.open("D:\\C++\\Bank statistic.txt", std::ios::in);
        if (!fp.is_open()) {
            std::cout << "打开文件失败!!!!\n";
            return;
        }

        std::cout << "请输入卡号:";
        std::cin.getline(a, sizeof(a) - 1);
        std::cin.ignore(); // 清除输入缓冲区中的换行符

        std::cout << "请输入密码:";
        std::cin.getline(b, sizeof(b) - 1);
        std::cin.ignore(); // 清除输入缓冲区中的换行符

        int fff = 0;
        char cardNumber[20];
        char cardKey[20];
        while (fp >> cardNumber >> cardKey) {
            if (strcmp(a, cardNumber) == 0 && strcmp(b, cardKey) == 0) {
                fff = 1;
                break;
            }
            i++;
        }

        fp.close();

        if (!fff) {
            printf("\n");
            printf("\t\t\t\t\t用户名或者密码输入错误!请重新输入!\n");
            count++;

            if (count == 3) {
                printf("\n");
                printf("密码错误次数已达到3次,即将退出系统");
                system("pause");
            }
        }
        else {
            printf("密码正确,正在登陆中");
            Successfullogin_Menu();
        }
    }
    void GetMoney() {
        int moneyWanted = 0;
        int moneyMax = 20000;
        std::ifstream fp;
        fp.open("D:\\C++\\Bank statistic.txt", std::ios::in);
        printf("请输入取款金额:");
        scanf_s("%d", &moneyWanted);
        if (moneyWanted > 20000)
        {
            printf("已超过最大取款金额,请重新输入");
            GetMoney_Menu();
        }
        int moneyRest;
        while (fp >> moneyRest) {
            if (moneyRest >= moneyWanted) {
                moneyRest = moneyRest - moneyWanted;
                Save();
                Successfullogin_Menu();
            }
            else {
                printf("已超过银行卡余额,请重新输入");
                GetMoney_Menu();
            }

        }

    }
};



int main()
{
    int i;
    char cardNumber[50] = {}, cardKey[50] = {};
    Operation operation(cardNumber, cardKey);
    do {
        First_Menu();
        printf("请输入数字以选择对应操作");
        scanf_s("%d", &i);
        switch (i)
        {
        case(1): {printf("您选择了1------登录");
            Login_Menu();
            operation.Login_Account();

            break; }
        case(2): {printf("您选择了2-------取款");
            GetMoney_Menu();
            operation.GetMoney();
        }
        }
    } while (i != 0);
}

同时 我的代码在之前能运行未出现上面的问题的时候还有 不管怎么输入账号和密码都提示账号密码错误(可是和外部文件的是一样的,增加断点后发现文件导入的要么就是乱码要么就是姓名和金额两列)
还有不管输错几次都不会跳出离开界面

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。