不从文件中读取数据

时间:2015-12-08 12:20:25

标签: c++

我做错了什么?我输入了正确的凭据,程序继续说"用户名或密码无效!"

void user::login()
{
    string username, uname;
    string password, pword;

    cout << "Enter your username: \n"; 
    cin >> uname;
    cout << "Enter your password: \n"; 
    cin >> pword;

    ifstream data("data.txt");
    if (data.is_open())
    {
        while (!data.eof())
        {
            data >> username >> password;

            if (uname == username && pword == password)
            {
                cout << "Login successfully!\n";
                Sleep(2000);
                mainMenu();
            }
            else if (uname != username || pword != password)
            {
                cout << "Invalid username or password!\n";
                Sleep(2000);
                login();
            }
        }
        data.close();
    }
}

1 个答案:

答案 0 :(得分:2)

请参阅我的内联评论:

#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