#include<iostream>
#include<fstream>
#include<string>
#include<cstring>
using namespace std;
void login(const char*, double, double&);
void information(const char*, double&);
void pay(const char*, double, double);
class VIP {
public:
double phonenumber; //手机号
string password; //密码
double money; //余额
double score; //积分
bool key; //判断是否是会员,1为会员
VIP() { //初始化
phonenumber = 0;
password = "noName";
money = 0;
score = 0;
key = 0;
}
VIP(double a, string b, double c, double d, double e) {
phonenumber = a;
password = b;
money = c;
score = d;
key = e;
}
VIP(const VIP& p) {
phonenumber = p.phonenumber;
password = p.password;
money = p.money;
score = p.score;
key = p.key;
}
~VIP() {
cout << "释放"<<phonenumber << endl;
};
void Append(const char*); //注册会员
int judgephone(const char*); //判断手机号正确性
int judgepass(const char*); //判断密码正确性
};
const VIP mark = { 0,"noName\0",0,0,0 }; //全局变量,空记录
int VIP::judgephone(const char* filename) {
fstream f1(filename, ios::in | ios::binary);
f1.seekg(0, ios::beg);
VIP p1;
int a = 0;
while (f1.read((char*)&p1, sizeof(VIP))) {
if(p1.phonenumber == phonenumber )
{
f1.close();
a = 1;
break;
}
if (p1.phonenumber == 1) {
f1.close();
break;
}
}
if (a) return 1;
else return 0;
}
int VIP::judgepass(const char* filename) {
fstream f2(filename, ios::in | ios::binary);
f2.seekg(0, ios::beg);
VIP p2;
int a = 0;
while (f2.read((char*)&p2, sizeof(VIP))) {
if (p2.password == password)
{
f2.close();
a = 1;
break;
}
if (p2.password=="noName\0") {
f2.close();
break;
}
}
if (a) return 1;
else return 0;
}
void VIP::Append(const char* filename) {
fstream file(filename, ios::in | ios::out | ios::binary);
VIP p3;
bool cannotcontinue = true;
file.seekg(0, ios::beg); //移动指针到文件头
do { //查找文件尾
file.read((char*)&p3, sizeof(VIP));
} while (p3.phonenumber != 0);
file.seekp(-long(sizeof(VIP)), ios::cur); //调整指针位置
while (cannotcontinue) { //控制程序,以确保密码格式正确
cout << "请输入密码:(6-12位)";
cin >> password;
int lenpassword = password.length();
if ((lenpassword < 6) || (lenpassword > 12)) {
cout << "密码的长度不被认可,请重新输入。\n";
}
else cannotcontinue = false;
}
p3.password = password;
p3.phonenumber = phonenumber;
file.write((char*)&p3, sizeof(VIP)); //写记录
file.write((char*)&mark, sizeof(VIP)); //写文件结束标志
cout << "已注册成功" << endl;
file.close();
}
void login(const char* filename, double phone1, double& phone2)
{
cout << "请选择:1 登录,2 注册:";
int choose1;
cin >> choose1;
VIP vip1;
vip1.phonenumber = phone1;
int k = vip1.judgephone(filename);
switch (choose1)
{
case 1:
if (k) {
while (1) {
cout << "请输入密码:\n"; //用密码加以验证,实现登录功能
cin >> vip1.password;
int m = vip1.judgepass(filename);
if (m) {
break;
//成功登录
}
else cout << "密码错误\n";
}
}
else {
cout << "该手机号不存在,请选择:1 重新输入手机号,2 注册";
int choose2;
cin >> choose2;
switch (choose2) {
case 1:
do {
cin >> vip1.phonenumber;
} while (!vip1.judgephone(filename));
while (1) {
cout << "请输入密码:\n"; //用密码加以验证,实现登录功能
cin >> vip1.password;
if (vip1.judgepass(filename)) {
break;
//成功登录
}
else cout << "密码错误\n";
}
break;
case 2:
//转到注册
cout << "是否用已输入的手机号注册(Y/N):";
char a;
cin >> a;
if (a == 'N') {
cin >> vip1.phonenumber;
}
if (vip1.judgephone(filename)) {
cout << "该手机号已注册会员,请重新输入:";
do {
cin >> vip1.phonenumber;
} while (vip1.judgephone(filename));
}
vip1.Append(filename);
//注册结束,成功登录
break;
default: return;break;
}
}
break;
case 2:
vip1.Append(filename);
//注册结束,成功登录
break;
default:return;break;
}
}
int main() {
fstream file1("C:\\Users\\lenovo\\Desktop\\1.txt", ios::in | ios::out | ios::binary);
fstream file2("C:\\Users\\lenovo\\Desktop\\2.txt", ios::in | ios::out);
VIP vip;
do {
file2 >> vip.phonenumber >> vip.password >> vip.money >> vip.score >> vip.key;
file1.write((char*)&vip, sizeof(VIP));
} while (vip.phonenumber != 0);
file1.close();
file2.close();
cout << "请输入手机号:";
double phone1, phone2 = 0;
cin >> phone1;
login("C:\\Users\\lenovo\\Desktop\\1.txt", phone1, phone2);
}
在第二次调用judgepass或judgephone二者之一会出现引发了未经处理的异常:读取访问权限冲突。
**_Pnext** 是 0xFFFFFFFFFFFFFFFF。问题。