C++:读取文件/用户名和密码

C++:读取文件/用户名和密码,c++,visual-c++,c++11,C++,Visual C++,C++11,我正在做一个程序,将提示用户登录使用他们的用户名和密码。我有一个textfileuserandpassword.txt,其中包含用户名和密码的列表。因此,用户输入他们的用户名和密码,他们的输入将与文本文件中的用户名和密码匹配。如果匹配,他们可以登录,如果不匹配,它将打印出无效的用户名或密码。下面是我所拥有的 textfileuserandpassword.txt john abcd mary efgh jane ijkl 我的密码 string line = " "; ifstream rea

我正在做一个程序,将提示用户登录使用他们的用户名和密码。我有一个textfileuserandpassword.txt,其中包含用户名和密码的列表。因此,用户输入他们的用户名和密码,他们的输入将与文本文件中的用户名和密码匹配。如果匹配,他们可以登录,如果不匹配,它将打印出无效的用户名或密码。下面是我所拥有的

textfileuserandpassword.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;
    }

}
然而,如果我输入用户名:mary和密码:efgh,它将返回如下所示的输出

Login Successfully!
InValid UserName And Password
InValid UserName And Password 
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.
如果我输入任何无效的用户名和密码,我的预期输出

Login Successfully!
Invalid Username and password.
关于如何实现预期产出,有什么想法或建议吗?谢谢

在找到正确的行并在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;
}
salt是一小段数据,附加或以某种方式集成到密码中,在密码存储到文件时随机生成。这样,即使两个用户使用相同的密码,哈希值也会不同。输入密码必须使用相同的salt进行散列,这就是为什么必须从文件中读取salt。

在找到正确的行并在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;
}


salt是一小段数据,附加或以某种方式集成到密码中,在密码存储到文件时随机生成。这样,即使两个用户使用相同的密码,哈希值也会不同。输入密码必须使用相同的salt进行散列,这就是为什么必须从文件中读取salt。

这是一个简单的逻辑错误。如果你希望某件事只发生一次,不要把它放在一个while循环中。你需要浏览文件并找到一个匹配项。如果找到一个,您可以停止搜索该文件。循环搜索后,您可以检查是否存在匹配项,例如,通过查看文件的状态并报告成功或失败。@john好的,谢谢您的帮助advise@DietmarKühl感谢您的建议,并在while中添加另一个条件,例如bool find=false;虽然找到&&getlinereadFile,第{..}行这是一个简单的逻辑错误。如果你希望某件事只发生一次,不要把它放在一个while循环中。你需要浏览文件并找到一个匹配项。如果找到一个,您可以停止搜索该文件。循环搜索后,您可以检查是否存在匹配项,例如,通过查看文件的状态并报告成功或失败。@john好的,谢谢您的帮助advise@DietmarKühl感谢您的建议,并在while中添加另一个条件,例如bool find=false;虽然found&&getlinereadFile,第{..}行回答得很好,但我认为如果两个输出语句都在循环之后执行,即如果found,则逻辑会更清晰{cout@john:你说得对,我尝试了尽可能多的更改。@urzeit谢谢你的帮助。不管怎样,你提到过最好对值密码和输入进行哈希运算。以及如何操作的技巧?@urzeit ok将对此进行更多的研究。再次感谢你的提示。很好的回答,但我认为如果两者都使用,逻辑会更清晰输出语句在循环之后完成,即如果找到{cout@john:你说得对,我尝试了尽可能多的更改。@urzeit谢谢你的帮助。不管怎样,你提到过最好对值密码和输入进行散列。以及如何进行的提示?@urzeit ok将对此进行更多的研究。再次感谢你的提示