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 iffin.good()
失败,您会收到错误消息,然后您可能无法访问目录?我会首先解决导致访问该文件的问题。谢谢!!这就是修复方法。因此,这是一种更好的方法,因为它只需继续向vars用户名
和密码
添加新变量即可。正确,这是正确的因此,请停止阅读文件的结尾。现在,请告诉我,您没有以纯文本形式存储密码。相信我,这不是为了某个大型项目。我这样做是作为一种学习经验。它们现在存储在.txt中,稍后我希望学习如何加密它们,如果我知道正确的话,也许可以使用函数crypt
。现在我只是想让它,你可以有一个帐户与你的高分保存在它。