Reputation: 27
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.
Upvotes: 0
Views: 3077
Reputation: 141918
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 beyond Usernames.capacity()
. The canonical way to append and item to a std::vector
is to call push_back()
.
Since your containers are std::vector<std::string>
, this is a better approach...
std::string username, password;
while (fin >> username >> password)
{
Usernames.push_back(username);
Passwords.push_back(password);
++sizeOfDatabase;
}
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 as Passwords.size()
); this may obviate the need to keep sizeOfDatabase
.
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 perhaps std::unordered_map<std::string, std::string>
, making the password lookup nice and quick per username.
Upvotes: 1
Reputation: 2829
I think you should start by adding this to the constructor of your ifstream
as you haven't specified you want the file opened for input:
ifstream fin( "dataBase.txt", ifstream::in );
if( !fin.good() )
{
cout << "Failed to open database file." << endl;
return;
}
See http://www.cplusplus.com/reference/fstream/ifstream/ifstream/ for additional literature.
Upvotes: 0