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

C++学校项目:如何按姓名查询文本文件中的员工记录并仅展示详情

按姓名查询员工详情的函数实现方案

我来帮你搞定这个searchname函数的实现,完全贴合你学校项目的要求哈!

首先,咱们先明确你的文件格式:每个员工的详情结尾都有一串星号分隔线,所以核心思路就是每次读取一个员工的完整信息块,直到遇到分隔线,再在这个块里查找目标姓名,匹配上就输出该员工的所有详情。

下面是完整的函数代码,我会逐段给你解释:

void hr::searchname() {
    char targetName[30];
    cout << "Enter the first name to search: ";
    cin >> targetName;
    cin.ignore(); // 清除输入缓冲区的换行符,避免干扰后续getline读取

    ifstream infile("example.txt");
    if (!infile.is_open()) {
        cout << "Error opening file!" << endl;
        return;
    }

    string line;
    string employeeBlock;
    bool found = false;

    // 用getline循环读取每行,文件结束时getline会返回false,完全不用eof()
    while (getline(infile, line)) {
        // 检查当前行是不是员工信息的分隔线
        if (line.find("*************************************************") != string::npos) {
            // 拼接要查找的精准字符串:"First name:目标姓名",避免误匹配类似名字
            string searchKey = "First name:";
            searchKey += targetName;
            // 检查当前员工块里是否包含目标姓名
            if (employeeBlock.find(searchKey) != string::npos) {
                cout << "\nFound employee details:\n";
                cout << employeeBlock << endl;
                found = true;
            }
            // 清空当前块,准备读取下一个员工的信息
            employeeBlock.clear();
        } else {
            // 不是分隔线,就把当前行加入员工信息块
            employeeBlock += line + "\n";
        }
    }

    // 处理文件末尾可能没有分隔线的特殊情况(虽然你的写入逻辑每次都加,但多一层保障)
    if (!employeeBlock.empty()) {
        string searchKey = "First name:";
        searchKey += targetName;
        if (employeeBlock.find(searchKey) != string::npos) {
            cout << "\nFound employee details:\n";
            cout << employeeBlock << endl;
            found = true;
        }
    }

    // 如果没找到匹配的员工,给出提示
    if (!found) {
        cout << "\nNo employee found with the name: " << targetName << endl;
    }

    infile.close();
}

关键细节说明:

  • 避开eof()的问题:用getline(infile, line)作为循环条件,这个函数会在文件读取完毕时自动返回false,完全不需要调用eof(),完美解决你提到的问题。
  • 精准匹配姓名:拼接成First name:目标姓名的字符串进行查找,这样不会出现比如输入"Test"时误匹配"Test2"的情况。
  • 处理输入缓冲区:用cin.ignore()清除cin >> targetName留下的换行符,避免后续的getline读取到空行,导致逻辑出错。
  • 鲁棒性处理:加入了文件打开失败的判断,以及文件末尾无分隔线的情况处理,还有未找到员工的提示,让程序更严谨。

另外,这里用到的string是C++标准库的内容,因为你已经用了using namespace std;,所以可以直接使用,完全符合你学校项目的要求。

内容的提问来源于stack exchange,提问作者Aeden Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:39:39