C++登录功能无法读取文件,始终提示账号或密码错误求助
问题排查与解决方案
首先直接回答你的参数疑问:
- 是的,
ios::app(或者你用的fstream::app)确实是ofstream的追加模式参数,它会让新写入的内容追加到文件末尾,而非覆盖原有内容。 ifstream是只读流,默认行为就是从文件开头读取内容,不存在“追加”这类针对写入的参数,所以不需要类似设置。
接下来看你遇到的登录失败问题,核心是两处代码逻辑bug:
1. 注册时的文件写入格式错误
你在注册流程中写完密码后没有添加换行符,导致多次注册的用户信息会粘连在一起。比如第一次注册user1和pass1,文件内容是:
user1 pass1
第二次注册user2和pass2后,文件会变成:
user1 pass1user2 pass2
这种情况下,读取时会把pass1user2当成用户名,自然和用户输入的正确用户名不匹配。
修复方法:在写入密码后添加换行符,保证每个用户的用户名和密码各占一行:
g<<regName<<"\n"; g<<regPassword<<"\n";
2. 登录时只读取了第一组用户数据
你的登录代码仅调用两次getline就关闭了文件,意味着永远只会对比第一个注册的用户信息,后续注册的用户完全没被纳入判断逻辑。
修复方法:循环读取文件中的每一组用户名和密码,直到找到匹配项或读取完整个文件:
修改后的登录部分代码:
if (command == 2) { ifstream f("Registration.txt"); if (!f.is_open()) { cout<< "could not open file \n"; return 0; } bool loginSuccess = false; string name, password; cout<< "\n\n\n"<< "Enter username: "; cin>>inName; cout<< "Enter password: "; cin>> inPassword; // 循环遍历所有注册用户信息 while (getline(f, name) && getline(f, password)) { if (inName == name && inPassword == password) { cout << "\n\n\nLOGIN SUCCESSFUL! \n\n\n Welcome!"<< inName; loginSuccess = true; break; } } f.close(); if (!loginSuccess) { cout<< "INCORRECT USERNAME OR PASSWORD"; } }
另外,原代码中登录环节的内层while(1)会无限循环提示错误,直到输入第一个用户的信息,现在改成读取所有用户后判断是否成功,逻辑更合理。
修正后的完整代码
#include<iostream> #include<fstream> #include<string> using namespace std; int main() { int command; string name,password,inName, inPassword,regName,regPassword; while(1) { cout<< " 1. REGISTER \n 2. LOGIN \n 3. EXIT" <<"\n\n"; cout<< "ENTER YOUR COMMAND NUMBER: \n"; cin>>command; if (command==3) { return 0; // 改为0更符合常规成功退出的返回值 } if (command == 1) { ofstream g("Registration.txt", ios::app); // 用ios::app更明确,和fstream::app效果一致 if (!g.is_open()) { cout<< "no such file exists \n"; return 0; } cout<< "\n\n\n Enter new username: "; cin>> regName; cout<< "\n New Password: "; cin>> regPassword; g<<regName<<"\n"; g<< regPassword<<"\n"; // 添加换行符分隔用户信息 g.close(); cout << "Registration successful!" << endl; // 增加注册成功提示 } if (command == 2) { ifstream f("Registration.txt"); if (!f.is_open()) { cout<< "could not open file \n"; return 0; } bool loginSuccess = false; cout<< "\n\n\n"<< "Enter username: "; cin>>inName; cout<< "Enter password: "; cin>> inPassword; while (getline(f, name) && getline(f, password)) { if (inName == name && inPassword == password) { cout << "\n\n\nLOGIN SUCCESSFUL! \n\n\n Welcome!"<< inName; loginSuccess = true; break; } } f.close(); if (!loginSuccess) { cout<< "\nINCORRECT USERNAME OR PASSWORD"; } cout << endl; } } return 0; }
修改后,注册的用户信息会按每行一个条目规整存储,登录时会遍历所有已注册用户进行匹配,就能正常完成登录流程了。
内容的提问来源于stack exchange,提问作者Jini
相关产品推荐
相关产品推荐

