C++:从文件/用户名和密码读取
Posted
技术标签:
【中文标题】C++:从文件/用户名和密码读取【英文标题】:C++: Reading from file /UserName and Password 【发布时间】:2013-10-10 05:47:35 【问题描述】:我正在做一个程序,它会提示用户使用他们的用户名和密码登录。我有一个包含用户名和密码列表的文本文件(userandpassword.txt)。所以发生的事情是,用户输入他们的用户名和密码,他们的输入将与文本文件中的用户名和密码匹配。如果匹配,他们可以登录,如果不匹配,它将打印出“无效的用户名或密码”。以下是我所拥有的。
文本文件(用户名和密码.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!
但这不是我想要的结果,我想要的是它逐行读取文件中的用户名和密码,如果与用户的输入匹配,它只会输出“登录成功”,如果它不匹配,它只会打印出“无效的用户名和密码”。
例如
如果我输入用户名:mary 和密码:efgh,我的预期输出
Login Successfully!
如果我输入任何无效的用户名和密码,我的预期输出
Invalid Username and password.
关于我应该如何实现预期输出的任何想法或建议?谢谢
【问题讨论】:
这是一个简单的逻辑错误。如果您希望某事只发生一次,请不要将其置于 while 循环中。 您需要浏览文件并找到匹配项。如果找到,您可以停止搜索该文件。在循环搜索之后,您检查是否存在匹配,例如,通过查看文件的状态并报告成功或失败。 @john 好的,谢谢你的建议 @DietmarKühl 也感谢您的建议 在你的 while 中添加另一个条件,例如bool found=false; while (!found && getline(readFile,line)) ..
【参考方案1】:
找到正确的行后添加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 是附加或以某种方式集成到密码中的一小段数据,是在将密码存储到文件时随机生成的。这样,哈希值就会不同——即使两个用户使用相同的密码。输入密码必须使用相同的盐进行哈希处理,这就是为什么必须从文件中读取盐的原因。
【讨论】:
不错的答案,但我认为如果两个输出语句都在循环之后完成,即if (found) cout << "Login ..." else cout << "invalid ..."
,逻辑会更清晰。这是 OP 似乎正在努力解决的逻辑。
@john:你说得对,我尝试尽可能多地进行更改。
@urzeit 感谢您的帮助。无论如何,你提到最好对密码和输入进行哈希值处理。以及如何去做的提示?
@urzeit Alright 将对此进行更多研究。再次感谢您的提示以上是关于C++:从文件/用户名和密码读取的主要内容,如果未能解决你的问题,请参考以下文章