knight_166 2022-10-18 16:49 采纳率: 100%
浏览 28
已结题

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<iostream>
#include<cstdio>
#include<cstdlib>
#include<windows.h>
#include<cstring>
#include<string>
#include<fstream>
#include <cassert>
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 << "用户名:"<<name<<"\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;
}
  • 写回答

1条回答 默认 最新

  • bostonAlen 2022-10-18 17:07
    关注

    使用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;
        }
       
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月1日
  • 已采纳回答 10月24日
  • 创建了问题 10月18日

悬赏问题

  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来