C++ 程序在试图访问文件fstream--C++;

C++ 程序在试图访问文件fstream--C++;,c++,fstream,crash-reports,C++,Fstream,Crash Reports,我正在制作一个用户数据库。当我试图打开保存所有用户和密码的“dataBase.txt”时,控制台会弹出(这应该发生,因为它是一个控制台应用程序),但它说程序已经完成。当我关闭它时,我的电脑告诉我程序崩溃了。该函数保存在一个类中 经过一些调试后,代码似乎在ifstreamfin(“dataBase.txt”)崩溃 编译器不会返回任何错误。 调用的函数的代码是: void User_Psw::UserCheck() { // read from the database ifstre

我正在制作一个用户数据库。当我试图打开保存所有用户和密码的
“dataBase.txt”
时,控制台会弹出(这应该发生,因为它是一个控制台应用程序),但它说程序已经完成。当我关闭它时,我的电脑告诉我程序崩溃了。该函数保存在一个类中

经过一些调试后,代码似乎在
ifstreamfin(“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";
    }
}
void User\u Psw::UserCheck()
{
//从数据库中读取
ifstream fin(“dataBase.txt”);
而(!fin.eof())
{
fin>>用户名[sizeOfDatabase]>>密码[sizeOfDatabase];
sizeOfDatabase++;//在.txt中的行数
}
//节目的其余部分
cout>用户名;
getNameIndex();
cout>密码;
如果(!PasswordMatches())
{

cout我认为您应该首先将其添加到
ifstream的构造函数中,因为您没有指定要打开文件以供输入:

ifstream fin( "dataBase.txt",  ifstream::in );

if( !fin.good() )
{
    cout << "Failed to open database file." << endl;
    return;
}
ifstream-fin(“dataBase.txt”,ifstream::in);
如果(!fin.good())
{
cout。该函数只有在读取失败后才有用

但是,崩溃的一个可能原因是您正在分配给
用户名[sizeOfDatabase]
,这可能超出了
Usernames.capacity()
。将和项附加到项目的规范方法是调用

因为您的容器是
std::vector
,所以这是一种更好的方法

std::string username, password;
while (fin >> username >> password)
{
    Usernames.push_back(username);
    Passwords.push_back(password);
    ++sizeOfDatabase;
}
当然,如果您想在读取文件后知道用户名或密码的数量,可以调用
usernames.size()
(应该与
passwords.size()
相同);这样就无需保留
sizeOfDatabase


就个人而言,我会使用一个单独的容器来存放用户名和密码,而不是两个单独的容器;或者,或者,可能会使每个用户名的密码查找更方便快捷。

我认为您的错误不止这些。请查看
fin
。如果所有其他方法都失败了,请阅读文档!用户名和密码如何声明?也是
,而(!fin.eof())
可能没有执行您认为它正在执行的操作。为什么要执行
用户名[sizeOfDatabase]
让我想,在某个地方有一个vector/deque/array/fixed array,它的内存将超过其分配大小的一个元素被踩踏?我将
用户名
称为
std::vector Usernames;
Password
称为
std::vector Password;
我认为
而(!fin.eof())
检查文件中的行数,然后将其保存到变量
sizeOfDatabase
,然后将其用作索引。我更改了
ifstrea::in
并检查文件是否良好,但当我运行程序时,没有一行弹出提示
无法打开数据库文件我认为它很好,但程序仍然崩溃。@ponger3d if
fin.good()
失败,您会收到错误消息,然后您可能无法访问目录?我会首先解决导致访问该文件的问题。谢谢!!这就是修复方法。因此,这是一种更好的方法,因为它只需继续向vars
用户名
密码
添加新变量即可。正确,这是正确的因此,请停止阅读文件的结尾。现在,请告诉我,您没有以纯文本形式存储密码。相信我,这不是为了某个大型项目。我这样做是作为一种学习经验。它们现在存储在.txt中,稍后我希望学习如何加密它们,如果我知道正确的话,也许可以使用函数
crypt
。现在我只是想让它,你可以有一个帐户与你的高分保存在它。