首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >程序在试图访问文件fstream时崩溃--C++

程序在试图访问文件fstream时崩溃--C++
EN

Stack Overflow用户
提问于 2013-02-10 03:33:30
回答 2查看 2.8K关注 0票数 0

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

经过一些调试,代码似乎在ifstream fin("dataBase.txt");崩溃了

编译器不返回错误.

函数的代码是:

代码语言:javascript
运行
复制
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";
    }
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-10 03:50:39

控制回路。该函数只有在读取失败后才有用。

不过,造成崩溃的一个可能原因是,您要分配给Usernames[sizeOfDatabase],这可能超出了Usernames.capacity()。将项和项附加到std::向量的规范方法是调用push_back()

因为您的容器是std::vector<std::string>,这是一个更好的方法.

代码语言:javascript
运行
复制
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::unordered_map,使得每个用户名都能快速查找密码。

票数 1
EN

Stack Overflow用户

发布于 2013-02-10 03:40:01

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

代码语言:javascript
运行
复制
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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14794424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档