gpt4 book ai didi

c++ - 程序在尝试访问文件时崩溃,fstream --C++

转载 作者:行者123 更新时间:2023-11-28 07:46:30 25 4
gpt4 key购买 nike

我正在制作一个用户数据库。当我尝试打开包含所有用户和密码的 "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";
}
}

如果需要,我可以添加更多代码片段。

最佳答案

Don't use fin.eof() to control a loop .该函数仅在读取失败后才有用。

然而,崩溃的一个可能原因是您正在分配给 Usernames[sizeOfDatabase] , 这可能超出 Usernames.capacity() .将项目附加到 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 的需要.

就个人而言,我会为用户名和 (salted, hashed) passwords 使用一个容器,而不是两个单独的容器; std::map<std::string, std::string> 或者也许 std::unordered_map<std::string, std::string> ,使每个用户名的密码查找变得又好又快。

关于c++ - 程序在尝试访问文件时崩溃,fstream --C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14794424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com