我正在建立一个用户数据库。当我尝试打开包含所有用户和密码的"dataBase.txt"
时,控制台会弹出(这应该发生,因为它是一个控制台应用程序),但它表示该程序已经完成。当我关闭它时,我的电脑告诉我程序崩溃了。该功能保存在一个类中。
经过一些调试后,代码似乎在ifstream fin("dataBase.txt");
编译器未返回任何错误。
所调用函数的代码为:
void User_Psw::UserCheck()
{
// read from the database
ifstream fin("dataBase.txt");
while (!fin.eof())
{
fin >> Usernames[sizeOfDatabase] >> Password[sizeOfDatabase];
sizeOfDatabase++; //The Number of lines in .txt
}
// rest of the program
cout << "Username: ";
cin >> username;
getNameIndex();
cout << "Password: ";
cin >> password;
if(!PasswordMatches())
{
cout << "Access denied";
}
}
如果被问到,我可以添加更多代码段。
答案 0 :(得分:1)
Don't use fin.eof()
to control a loop。该函数仅在读取失败后才有用。
然而,崩溃的一个可能原因是您要分配给Usernames[sizeOfDatabase]
,这可能超出Usernames.capacity()
。将std::vector
追加和项目的规范方法是致电push_back()
。
由于您的容器是std::vector<std::string>
,这是一种更好的方法......
std::string username, password;
while (fin >> username >> password)
{
Usernames.push_back(username);
Passwords.push_back(password);
++sizeOfDatabase;
}
当然,如果您想在读取文件后知道用户名或密码的数量,可以调用Usernames.size()
(应该与Passwords.size()
相同);这可以避免保留sizeOfDatabase
的必要性。
就个人而言,我会使用单个容器作为用户名和(salted, hashed) passwords,而不是两个单独的容器; std::map<std::string, std::string>
或std::unordered_map<std::string, std::string>
,使每个用户名的密码查找更加快捷。
答案 1 :(得分:0)
我认为您应该首先将此添加到ifstream
的构造函数中,因为您尚未指定要为输入打开文件:
ifstream fin( "dataBase.txt", ifstream::in );
if( !fin.good() )
{
cout << "Failed to open database file." << endl;
return;
}
有关其他文献,请参阅http://www.cplusplus.com/reference/fstream/ifstream/ifstream/。