C++读取员工工时文件 运行后不显示最后一名员工Bob Hu薪资数据求助
核心问题定位
- 结算触发逻辑缺失:原代码仅在
while循环读取到员工名发生变化的新记录时,才会结算上一位员工的薪资并打印。当文件遍历到最后一位员工Bob Hu的全部工时记录时,循环直接触达文件末尾退出,没有后续新记录触发结算分支,导致他的累计工时从未被计算输出。 - 存在冗余操作:循环内首次判断名称不匹配时,连续两次重复截取
data_name的取值,属于无意义的重复执行步骤;同时多写了一次完全和if分支互斥的名称相等判断,无实际作用。
修复实现
- 调整结算逻辑:将原来重复的薪资计算、打印代码抽成独立的可复用逻辑,匹配你之前尝试封装函数的思路,在两个节点调用即可:
- 循环内检测到员工名变化、重置累计工时之前,调用一次结算逻辑,输出上一位员工的薪资
while循环完全结束、文件关闭之前,再调用一次结算逻辑,输出最后一位残留未结算的员工薪资
- 删掉冗余的重复代码段
修正后的完整可运行代码:
#include <iostream> #include <string> #include <fstream> using namespace std; void find_pay(string x) { ifstream inputFile; string filename; cout << "Enter the filename: "; cin >> filename; inputFile.open(filename); if(inputFile.is_open()) { string data_record, prev, data_name, data_hour; double total = 0; // 封装可复用的薪资结算输出逻辑 auto calc_and_print = [](const string& emp_name, double total_hours) { if (total_hours == 0) return; float gross_pay = 18 * total_hours; float tax = (12 * gross_pay)/100; float net_pay = gross_pay - tax; cout << "Employee:" << emp_name << "\n" << "Total Hours: " << total_hours << " Gross Pay: $ " << gross_pay << " Tax " << tax << " Net Pay: " << net_pay << endl; }; while(getline(inputFile, data_record)) { data_name = data_record.substr(0, 30); data_hour = data_record.substr(31, 2); if(prev.compare(data_name)!= 0 ) { // 名称变化时,先结算上一位员工的薪资 calc_and_print(prev, total); // 重置为新员工的累计计数 prev = data_name; total = 0; } // 同员工记录,累加工时 total += stod(data_hour); } // 循环结束后,结算最后一位未触发结算的员工 calc_and_print(prev, total); inputFile.close(); } } int main() { string filename; find_pay(filename); return 0; }
修复后运行效果
- 正常输出Bob Hu的统计数据:累计工时40,总薪资720,税费86.4,净薪资633.6
- 不存在重复结算、漏结算的问题,同时移除了原代码中冗余的重复取值、重复判断的代码段
内容的提问来源于stack exchange,提问作者Karla
相关产品推荐
相关产品推荐

