You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++输入值与文本文件账号匹配失败问题排查求助

错误原因定位
  • 核心逻辑错误:C风格字符串比较方式错误:代码中acc_num和accno_input都是char类型数组,直接用==运算符比较的是两个数组的内存首地址,而非字符串内容,就算两个字符串内容完全一致,比较结果也永远为false,导致匹配永远失败。
  • 行数统计逻辑错误:使用while (!file.eof())统计行数的方式不正确,eof标记是读取操作失败后才会被置位,会导致统计的行数比实际行数多1,后续读取会员数据的循环会多执行无效的读取步骤,拿到垃圾值参与比较。
  • 文件流状态处理错误:如果账号匹配失败走goto逻辑重试时,最开始打开的member文件流已经读到文件末尾,不会自动复位,也没有重新打开,后续重试永远读不到数据;同时提前统计行数单独打开一次文件属于冗余逻辑。
  • 读取逻辑未做有效性校验:循环读取文件字段时,没有判断文件流的读取状态,就算已经读到文件末尾,仍然会继续执行读取操作,拿到无效的垃圾数据。
  • 循环边界错误:统计完行数后读取循环写的是while(i <= count),就算行数统计正确,也会多执行一次读取操作。
修复方案
  1. 把存储字段的C风格char数组替换为std::string类型,可直接用==比较字符串内容;如果保留char数组,需要调用strcmp函数比较。
  2. 删掉冗余的行数统计逻辑,改为直接逐行读取文件内容,每行单独拆分字段,避免格式错位影响后续读取。
  3. 账号匹配失败重试时,重新打开文件或者将文件指针重置到文件开头,保证读取数据正常。
  4. 每次读取字段后判断流状态,过滤无效的读取结果。

注意:使用逐行拆分字段的方案需要引入<sstream>头文件。

修正后的参考代码
#include <sstream>
// 其余原有头文件保留
string member_login(){
    title();
    string pass_input, line, acc_num1, password1;
    int login_attempt = 0, account = 0;
    char dummy, resp;
    // 全部替换为string类型,避免C风格字符串的各类问题
    string accno_input, name, icno, email, phone_number, acc_num, password, month, year;

    account_num:
    account = 0;
    cout << "                                          Enter your account number : ";
    cin >> accno_input;

    // 每次匹配前重新打开文件,保证指针在开头
    ifstream member("Membership.txt");
    if (!member.is_open()) {
        cout << "打开会员文件失败" << endl;
        return "";
    }

    // 直接逐行读取,不需要提前数行数
    while (getline(member, line)) {
        istringstream line_stream(line);
        getline(line_stream, name, '|');
        getline(line_stream, icno, '|');
        getline(line_stream, email, '|');
        getline(line_stream, phone_number, '|');
        getline(line_stream, acc_num, '|');
        getline(line_stream, password, '|');
        getline(line_stream, month, '|');
        getline(line_stream, year);

        // 校验读取状态,跳过格式错误的行
        if (!line_stream.good()) continue;

        cout << name << " " << icno << " " << acc_num << " " << accno_input << endl;

        // string直接用==比较内容,逻辑正确
        if (acc_num == accno_input) {
            account = 1;
            break;
        }
    }

    member.close();
    cout << account;

    if (account != 1) {
        cout << endl;
        cout << "                                  Your account not found !!!"<< endl;
        cout << "                                  Please try again !!" << endl << endl;
        cout << "                                  PLEASE ENTER ANY KEY TO CONTINUE >>> ";
        cin >> dummy;
        goto account_num;
    }

    password1 = password;
    cout << endl;
    cout << "                                          Enter your account password : ";
    cin >> pass_input;

    for (login_attempt = 1 ; login_attempt <= 2 ; login_attempt ++){
        if (pass_input == password1){
            cout << "Login Successful !!!";
            break;
        }

        cout << endl;
        cout << "Login Failed. Attempt " << login_attempt  << " of 3" << endl;
        cout << "Please re-enter Password: " ;
        cin >> pass_input;

        if (pass_input == password1){
            cout << "Login Successful !!!";
                break;
        }
    }

    if ( login_attempt == 3){
        cout << endl;
        cout << "Login Failed. Attempt 3 of 3";
    }

    return accno_input;
}

内容的提问来源于stack exchange,提问作者Mathavan Krishnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:06:03