I am making a user database. When I try to open the "dataBase.txt" which holds all of the users and passwords, the console pops up (which should happen since it is a console application) but it says that the program has already complete. When I close it, my computer tell me that the program had crashed. The function is saved in a class.
After some debugging the code seems to crash at ifstream fin("dataBase.txt");
No error is returned from the compiler.
The code for the function called is:
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";
}
}
I can add more code snippets if asked.
Don’t use
fin.eof()to control a loop. That function is only useful after a read has failed.A likely reason for the crash, however, is that you are assigning to
Usernames[sizeOfDatabase], which may be beyondUsernames.capacity(). The canonical way to append and item to astd::vectoris to callpush_back().Since your containers are
std::vector<std::string>, this is a better approach…Of course, if you want to know the number of usernames or passwords once the file has been read, you can call
Usernames.size()(which should be the same asPasswords.size()); this may obviate the need to keepsizeOfDatabase.Personally, I would use a single container for usernames and (salted, hashed) passwords, rather than two separate containers; either
std::map<std::string, std::string>or perhapsstd::unordered_map<std::string, std::string>, making the password lookup nice and quick per username.