C++ 文件打开时报错

问题遇到的现象和发生背景

希望在打开文件时如果文件打开失败(无此文件),就循环让用户输入,直到输入的文件名能打开。
程序现状:
1.第一次输入能打开就没问题。
2.第一次输入打开失败后反复输入错误的文件名也没事
3.在输入错误的文件名后输入正确的文件名程序崩溃

用代码块功能插入代码,请勿粘贴截图

问题代码:

string a, b, c, d;
    cout << "请输入用户名\n";
    cin >> b;
    c = b + ".txt";
    ifstream infile;
    infile.open(c.data());
    int q = 0;
    q = infile.is_open();
    while(q == 0)
    {
        cout << "无此用户!请重新输入用户名!\n";
        infile.close();
        cout << "请输入用户名\n";
        cin >> b;
        c = b + ".txt";
        ifstream infile;
        infile.open(c.data());
        q = infile.is_open();
    }
    getline(infile, a);

全代码
h:

#pragma once
#include
#include
#include
#include
#include
#include
#include
#include 
using namespace std;
void login()
{
    string a, b, c, d;
    cout << "请输入用户名\n";
    cin >> b;
    c = b + ".txt";
    ifstream infile;
    infile.open(c.data());
    int q = 0;
    q = infile.is_open();
    while(q == 0)
    {
        cout << "无此用户!请重新输入用户名!\n";
        infile.close();
        cout << "请输入用户名\n";
        cin >> b;
        c = b + ".txt";
        ifstream infile;
        infile.open(c.data());
        q = infile.is_open();
    }
    getline(infile, a);
    a=a.substr(7);
    int ans = 0;
    if (a == b) ans++;
    cout << "请输入密码\n";
    getline(infile, a);
    a = a.substr(5);
    while (1)
    {
        cin >> b;
        if (a == b) ans++;
        if (ans == 2) cout << "登陆成功!\n";
        else cout << "密码错误!请重新输入密码!\n";
    }
    infile.close();
}
void register_lsq()
{
    cout << "请输入用户名\n";
    char filename[100000000];
    ofstream a;
    scanf("%s", filename);
    string name = filename;
    strcat(filename, ".txt");
    a.open(filename, ios::out);
    string password;
    cout << "请输入密码\n";
    cin >> password;
    a << "用户名:"<"\n"<<"密码:" << password << "\n" << "分数:0";
    a.close();
    cout << "是否登录?\n"<<"登录请按1,退出请按2\n";
    int key;
    cin >> key;
    if (key == 1) login();
    else return;
}
void log_first()
{
    system("color F0");
    std::cout << "欢迎使用";
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY| BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_INTENSITY |
        FOREGROUND_RED| FOREGROUND_BLUE);
    std::cout << "无敌暴龙战神"; 
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY |
        FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
    std::cout<<"单词软件\n" << "首次使用请输入1\n已有账户请输入2\n管理员登录请按3\n";
    int key;
    std::cin >> key;
    if (key == 1)
    {
        register_lsq();
    }
    if (key == 2)
    {
        login();
    }
}


main:


#include"lsq.h"
using namespace std;
int main()
{
    log_first();
    return 0;
}

使用goto语句重复执行,另外文件open失败以后就不要再close了,因为是无效的句柄

login:
    string a, b, c, d;
    cout << "请输入用户名\n";
    cin >> b;
    c = b + ".txt";
    ifstream infile;
    infile.open(c.data());
    int q = 0;
    q = infile.is_open();
    while(q == 0)
    {
        cout << "无此用户!请重新输入用户名!\n";
        goto login;
    }