Please see my inline comments:
#include <string> #include <iostream> #include <fstream> // You should not use using namespace std! In here only for brevity. using namespace std; // Use a proper API: return account name on success, empty string otherwise. // Throw an exception on error. string login() throw (const char*) { // embrace C++11! if (ifstream data {"data.txt"}) { string username, uname; string password, pword; // Always test if the IO is broken! if (!((cout << "Enter your username: \n") && (cin >> uname) && (cout << "Enter your password: \n") && (cin >> pword))) { throw "Could not get user credentials."; } // debug output, remove in production: cerr << "Credentials: " << uname << " (" << pword << ")" << endl; // read a line from data.txt while (data >> username >> password) { // debug output, remove in production: cerr << "Read: " << username << " (" << password << ")" << endl; // compare input: if ((uname == username) && (pword == password)) { return username; } } // no input matched return ""; // no need to explicitly close the stream } else { throw "Password file could not be opened."; } } int main() { string account_name; try { // The caller should include a loop, not the login function. account_name = login(); } catch (const char *message) { cerr << "Error: " << message << endl; return 1; } if (!account_name.empty()) { cout << "Hello, " << account_name << endl; } else { cout << "Could not authenticate!" << endl; } return 0; }
data.txt:
Neuroosi hunter2 Kay supersecret Arunmu hello crashmstr password1234
logininside oflogin, but continuing on with thewhileloop (checking foreofis not good though...) to keep reading the file for a match.