0

我正在制作一个用户数据库。当我尝试打开"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";
    }
}

如果被问到,我可以添加更多代码片段。

4

2 回答 2

1

不要fin.eof()用来控制循环。该功能仅在读取失败后才有用。

但是,崩溃的一个可能原因是您分配给Usernames[sizeOfDatabase],这可能超出Usernames.capacity(). 将和项目附加到 a 的规范方法std::vector是调用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::string, std::string>或也许std::unordered_map<std::string, std::string>,使每个用户名的密码查找变得又快又好。

于 2013-02-10T03:50:39.427 回答
0

我认为您应该首先将其添加到您的构造函数中,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/

于 2013-02-10T03:40:01.707 回答