我正在做一个程序,它会提示用户使用他们的用户名和密码登录。我有一个文本文件(userandpassword.txt),其中包含用户名和密码列表。所以会发生什么,用户输入他们的用户名和密码,他们的输入将与文本文件中的用户名和密码匹配。如果匹配,他们可以登录,如果不匹配,它将打印出“无效的用户名或密码”。以下是我所拥有的。
文本文件(userandpassword.txt)
john abcd
mary efgh
jane ijkl
我的代码
string line = " ";
ifstream readFile("userandpassword.txt");
string UserName;
string Password;
string _UserName;
string _Password;
cout << "Enter UserName: ";
cin >> UserName;
cout << "Enter Password: ";
cin >> Password;
while (getline(readFile,line)) {
stringstream iss(line);
iss >> _UserName >> _Password;
if (UserName == _UserName && Password == _Password) {
cout << "Login Successfully!"<< endl;
}
else {
cout << "InValid UserName And Password"<< endl;
}
}
问题是如果我输入用户名:john和密码:abcd它将返回输出,如下所示
Login Successfully!
InValid UserName And Password
InValid UserName And Password
如果我输入用户名:mary和密码:efgh它将返回我,如下所示
InValid UserName And Password
Login Successfully!
InValid UserName And Password
最后是用户名:jane和密码:ijkl
InValid UserName And Password
InValid UserName And Password
Login Successfully!
但这不是我想要的结果,我想要的是它通过文件逐行读取用户名和密码,如果与用户的输入匹配,它将只输出“登录成功”,同样如果它不匹配,它只会打印出“无效的用户名和密码”。
e.g
如果我输入用户名:mary和密码:efgh,我的预期输出
Login Successfully!
如果我输入任何无效的用户名和密码,我的预期输出
Invalid Username and password.
关于如何实现预期输出的任何想法或建议?感谢
答案 0 :(得分:4)
找到正确的行后添加break
并在while循环后面输出无效消息:
bool found = false;
while (getline(readFile,line)) {
stringstream iss(line);
iss >> _UserName >> _Password;
if (UserName == _UserName && Password == _Password) {
cout << "Login Successfully!"<< endl;
found = true;
break;
}
}
if (!found) {
cout << "InValid UserName And Password"<< endl;
}
编辑:顺便说一下。在纯文本文件中保护任何密码凭证并不是一个好主意。您应该保护密码的哈希值(盐渍),对用户输入进行哈希处理并比较哈希值。这样,即使有人获取文件,他也必须打破散列算法才能找到实际的密码。
Edit2:哈希可以由一个可用的井测试哈希函数生成(例如sha-1,sha-3)。这个选择取决于它必须如何安全以及代码计算这种哈希的可靠性。一般过程是(伪代码):
cin >> username;
for-each-row in file do:
read username-in, salt, password-hash-in
if (username-in == username && hash(salt, password) == password-hash-in):
success!
salt是一小段数据,附加或以某种方式集成到密码中,并在密码存储到文件时随机生成。这样,哈希将是不同的 - 即使两个用户使用相同的密码。输入密码必须使用相同的盐进行哈希处理,这就是必须从文件中读取盐的原因。