运行无报错 运行后操作过程中说‘Card_Number’ was corrupted
#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即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。