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

