C++使用文本文件存储用户数据时登录功能仅同次运行注册后可用
问题根因
你的登录逻辑存在核心设计错误,直接使用未初始化的全局变量拼接校验字符串,导致程序重启后无法匹配文件中已存储的账号数据:
- 全局变量
admin、status仅在注册函数createAcc中被赋值,程序重启后直接执行登录时,这两个变量是未初始化的随机值,拼接出来的userPass和文件内存储的真实数据完全不匹配,自然会提示账号密码错误。 - 你当前的校验逻辑完全不合理:登录时应该逐行读取文件内容,拆分每行的用户名、角色、密码、状态四个字段,先匹配输入的用户名,再对比对应行的密码是否正确,最后判断账号状态是否可用,而不是提前拼接固定字符串去匹配整行。
修复方案
修改loginAcc函数的校验逻辑,读取文件后拆分每行字段做对应校验,修改后的代码如下:
void loginAcc() { cout << "\n\n"; cout << "=================================" << endl; cout << setw(25) << "USER LOGIN" << endl; cout << "=================================" << endl; cout << "Enter Username : " << endl; cin >> inputusername; cout << "Enter Password : " << endl; cin >> inputpassword; string line; ifstream userData; userData.open("userdata.txt"); bool found = false; char fileAdmin, fileStatus; string fileUsername, filePassword; if(userData.is_open()) { while(userData >> fileUsername >> fileAdmin >> filePassword >> fileStatus && !found) { // 先匹配用户名和密码 if (fileUsername == inputusername && filePassword == inputpassword) { found = true; // 匹配成功后给全局变量赋值 admin = fileAdmin; status = fileStatus; } } userData.close(); if(found){ if(status == 'b') { cout << endl << "User deleted by admin" << endl; login = false; } else{ login = true; administrator = (admin == 'a'); cout << "Successfully Logged In!" << endl; } } else{ cout << endl << "Username or Password is Incorrect" << endl; } } }
额外优化建议
- 注册时可以先判断用户名是否已存在,避免重复注册相同账号
- 全局变量尽量减少使用,可以把用户信息封装为结构体传递,避免变量污染导致的逻辑错误
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

