https://blog.csdn.net/weixin_38593332/article/details/82689393
登陆注册,txt保存用户名密码
首先资源视图,建立两个对话框,ID改为IDD_DIA_LOGIN和IDD_DIA_JOIN,分别添加类Login和Join。
在CXXX.cpp文件中添加头文件#include "Login.h",然后在cpp函数InitInstance()中CXXXDlg dlg; 语句之上,添加
Login Dlg;
Dlg.DoModal();
为Login.cpp添加头文件#include "Join.h"更改Login.cpp中的注册函数
void Login::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
Join Dlg2;
Dlg2.DoModal();
}
Join界面的“注册”按钮双击,添加注册函数,输入框两个变量分别为m_edit1和m_edit2
void Join::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CString m_Sign_Account,m_Sign_Pass; //定义一个变量str
m_edit1.GetWindowText(m_Sign_Account);
m_edit2.GetWindowText(m_Sign_Pass);
m_Sign_Account.TrimLeft();
m_Sign_Account.TrimRight();
m_Sign_Pass.TrimLeft();
m_Sign_Pass.TrimRight();
if((m_Sign_Account=="")||(m_Sign_Pass==""))
{
AfxMessageBox("error");
return;
}
// TODO: 在此添加控件通知处理程序代码
CString username;//从文件中读取用户名进行校验,如果输入的用户名在文件已存在则不进行注册
CString sex;
bool flag=false;//标记
char * path="username.txt";//文件路径
CFile fp;//使用MFC的CFile将暑假写入文件
fp.Open((LPCTSTR)path,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
fp.SeekToBegin();//移动文件指针位置至文件头
CArchive ar(&fp,CArchive::load);//使用CArchive进行读取文件
UpdateData();//将数据从控件复制到控件变量
//进行左右空格清除
//单选框选择并获取其文本
// UINT nID=GetCheckedRadioButton(IDC_RADIO_MAN,IDC_RADIO_WOMAN);
// GetDlgItemText(nID,sex);
//校验操作
while(ar.ReadString(username))
{
username.TrimLeft();
username.TrimRight();
if(strcmp(username,m_Sign_Account)==0) {
flag=true;//如果已存在用户名,则标记flag为true
break;
}
else {
ar.ReadString(username);//读取下一行(每一行为一个属性,比如用户名,密码,性别,总共3 个属性)
ar.ReadString(username);//读取下一
}
}
ar.Close();
fp.SeekToEnd(); //文件写入为追加操作,所以写入前必须将文件指针移动至文件尾
if(!flag)
{
//CFile Write(*str,GetLength())写入
fp.Write(m_Sign_Account,m_Sign_Account.GetLength());
//win虽是\r\n,在写程序只需要\n即可换行
fp.Write("\n",sizeof(char));
fp.Write(m_Sign_Pass,m_Sign_Pass.GetLength());
fp.Write("\n",sizeof(char));
fp.Write(sex,sex.GetLength());
fp.Write("\n",sizeof(char));
fp.Close();
AfxMessageBox("注册成功");
CDialog::OnOK();
}
else
{
MessageBox("用户已存在");//用户已存在提示框,不关闭注册框,可让用户自由选择是否继续注册
}
//OnOK();
}
更改Login.cpp中的登陆函数,输入框两个添加变量分别为m_edit3和m_edit4
void Login::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();//将控件数据复制给控件变量
CString m_Login_Account,m_Login_Pass;
m_edit3.GetWindowText(m_Login_Account);
m_edit4.GetWindowText(m_Login_Pass);
CString username;
CString password;
//CString sex;
//与注册类似操作
bool flag=false;
char * path="username.txt";
CFile file;
file.Open(path,CFile::modeRead);
file.SeekToBegin();
CArchive ar(&file,CArchive::load);
//去除数据左右空格数据
m_Login_Account.TrimLeft();
m_Login_Account.TrimRight();
m_Login_Pass.TrimLeft();
m_Login_Pass.TrimRight();
//校验用户密码,与注册校验相同的操作,这里多验证了一步,即校验密码
while(ar.ReadString(username))
{
if(ar.ReadString(password))
{
username.TrimLeft();
username.TrimRight();
password.TrimLeft();
password.TrimRight();
if(strcmp(username,m_Login_Account)==0
&&strcmp(password,m_Login_Pass)==0)
{
flag=true;
//ar.ReadString(sex);//如果用户验证正确,flag=true,并且sex为用户的性别
break;
}
}
//ar.ReadString(sex);
}
//关闭CFile和CArchive
ar.Close();
file.Close();
if(flag)
{
AfxMessageBox(m_Login_Account+" "+" "+"成功登录");//找到则显示的是用户名+性别+已登录
m_Login_Account="";//成功登录后把用户框和密码框文本清除
m_Login_Pass="";
UpdateData(FALSE);//将数据从控件变量传递给控件
OnOK();
}
else{
MessageBox("用户名不存在或密码错误");//用户密码错误或用户不存在提示
}
}
禁用Login的×按钮(属性里添加函数OnInitDialog()),取消按钮关闭程序
BOOL Login::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
::EnableMenuItem(::GetSystemMenu(this->m_hWnd, false), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void Login::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
//OnCancel();
exit(0);
}