C++如何读取文本文件中的姓氏与名字并按姓氏排序展示
问题分析
你的现有代码存在两个核心问题:
- 读取逻辑只每次读取单个字符串,没有同时读取姓氏和名字,无法保留完整姓名信息
- 比较逻辑仅基于读取到的单个字符串做排序判断,没有按姓氏维度做比较
假设前提
我们先约定你的RandomNames.txt存储格式为名 姓空格分隔,每行/连续两个字符串对应一个人的完整姓名,例如小明 王、Tom Smith都是合法的存储格式。如果你的文件是姓在前名在后,调整代码里的读取顺序即可。
修改方案
核心修改点
- 每次读取操作同时读取名和姓两个字符串,绑定对应关系
- 比较时使用姓氏作为判断依据,匹配按姓氏排序的需求
- 存储最小/最大排序位的完整姓名,输出时同时展示名和姓
修改后完整代码
#include <iostream> #include <string> #include <fstream> using namespace std; int main() { ifstream inputFile; // 分别存储当前读取的名、姓 string firstname, lastname; // 存储排序后第一位的名、姓,最后一位的名、姓 string first_person_firstname, first_person_lastname; string last_person_firstname, last_person_lastname; inputFile.open("RandomNames.txt"); if (inputFile) { // 先读取第一条完整姓名初始化首尾记录 inputFile >> firstname >> lastname; first_person_firstname = last_person_firstname = firstname; first_person_lastname = last_person_lastname = lastname; // 循环读取后续所有完整姓名 while (inputFile >> firstname >> lastname) { // 按姓氏比较,比当前第一位更小则更新第一位记录 if (lastname < first_person_lastname) { first_person_firstname = firstname; first_person_lastname = lastname; } // 按姓氏比较,比当前最后一位更大则更新最后一位记录 else if (lastname > last_person_lastname) { last_person_firstname = firstname; last_person_lastname = lastname; } } inputFile.close(); } else { cout << "文件打开失败,请检查文件路径是否正确" << endl; return 1; } // 输出完整姓名,格式可自行调整 cout << "First student in line = " << first_person_firstname << " " << first_person_lastname << endl; cout << "Last student in line = " << last_person_firstname << " " << last_person_lastname << endl; return 0; }
扩展说明
如果你需要输出所有按姓氏排序的学生名单,而不仅仅是首尾两位,可以将所有姓名存入vector<pair<string, pair<string, string>>>结构(第一个元素存姓氏作为排序键,第二个pair存完整姓名),调用sort函数排序后遍历输出即可。
内容的提问来源于stack exchange,提问作者queenbelle02
相关产品推荐
相关产品推荐

