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
相关产品推荐
相关产品推荐

