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

C++读取员工工时文件 运行后不显示最后一名员工Bob Hu薪资数据求助

核心问题定位
  • 结算触发逻辑缺失:原代码仅在while循环读取到员工名发生变化的新记录时,才会结算上一位员工的薪资并打印。当文件遍历到最后一位员工Bob Hu的全部工时记录时,循环直接触达文件末尾退出,没有后续新记录触发结算分支,导致他的累计工时从未被计算输出。
  • 存在冗余操作:循环内首次判断名称不匹配时,连续两次重复截取data_name的取值,属于无意义的重复执行步骤;同时多写了一次完全和if分支互斥的名称相等判断,无实际作用。
修复实现
  1. 调整结算逻辑:将原来重复的薪资计算、打印代码抽成独立的可复用逻辑,匹配你之前尝试封装函数的思路,在两个节点调用即可:
    • 循环内检测到员工名变化、重置累计工时之前,调用一次结算逻辑,输出上一位员工的薪资
    • while循环完全结束、文件关闭之前,再调用一次结算逻辑,输出最后一位残留未结算的员工薪资
  2. 删掉冗余的重复代码段
    修正后的完整可运行代码:
#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 01:36:07