我正在制作一个用户数据库。当我试图打开保存所有用户和密码的"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";
}
}
如果需要的话,我可以添加更多的代码片段。。
发布于 2013-02-10 03:50:39
控制回路。该函数只有在读取失败后才有用。
不过,造成崩溃的一个可能原因是,您要分配给Usernames[sizeOfDatabase]
,这可能超出了Usernames.capacity()
。将项和项附加到std::向量的规范方法是调用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
。
就我个人而言,对于用户名和(咸的,散列的)密码,我会使用一个容器,而不是两个单独的容器;或者是std::map
,或者是std::unordered_map
,使得每个用户名都能快速查找密码。
发布于 2013-02-10 03:40:01
我认为您应该首先将它添加到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/。
https://stackoverflow.com/questions/14794424
复制相似问题