如何修改C++代码从文本文件读取多客户数据替代硬编码信息
代码修改方案
核心调整点
- 修正原代码类名、访问器/修改器的拼写错误,对齐作业要求的
PersonData类命名规范 - 新增静态成员变量自动生成唯一客户编号,无需手动硬编码编号值,保证编号全局唯一
- 引入文件流依赖,实现从
CustomerInfo.txt逐行读取解析客户数据,替换硬编码的单条客户信息 - 用动态数组存储多客户对象,读取完成后自动筛选愿意加入邮寄列表的客户打印全部信息
- 补充缺失的头文件引用,避免不同编译器下的编译报错
前置说明
假设CustomerInfo.txt采用逗号分隔每行字段的常规作业文本格式,每行对应1条客户数据,字段顺序为:姓氏、名字、地址、城市、州、邮编、电话、是否加入邮寄列表(true/false),示例内容如下:
Donald,Allen,abc apartment,Newyork,Newyork,10001,6667676222,false Bob,Smith,123 Main St,Los Angeles,California,90001,5551234567,true Charlie,Brown,456 Oak Ave,Chicago,Illinois,60601,5559876543,true
如果文本文件采用其他分隔符(如空格、制表符),只需修改代码中字符串分割的分隔符即可。
修改后完整可运行代码
#include <iostream> #include <fstream> #include <sstream> #include <vector> #include <string> using namespace std; // 基类PersonData,对齐作业命名要求 class PersonData { private: string lastName; string firstName; string address; string city; string state; int zip; string phone; public: // 无参构造函数,方便动态创建对象后通过setter赋值 PersonData() : zip(0) {} // 带参构造 PersonData(string lName, string fName, string addr, string pCity, string pState, int zCode, string pPhone) { lastName = lName; firstName = fName; address = addr; city = pCity; state = pState; zip = zCode; phone = pPhone; } // 访问器(getter) string getLastName() { return lastName; } string getFirstName() { return firstName; } string getAddress() { return address; } string getCity() { return city; } string getState() { return state; } int getZip() { return zip; } string getPhone() { return phone; } // 修改器(setter) void setLastName(string lName) { lastName = lName; } void setFirstName(string fName) { firstName = fName; } void setAddress(string addr) { address = addr; } void setCity(string pCity) { city = pCity; } void setState(string pState) { state = pState; } void setZip(int zCode) { zip = zCode; } void setPhone(string pPhone) { phone = pPhone; } }; // 派生类customerData class customerData : public PersonData { private: int customerNumber; bool mailingList; // 静态成员变量,记录下一个可用的客户编号,保证唯一性 static int nextCustomerNumber; public: // 无参构造 customerData() : customerNumber(0), mailingList(false) { // 创建新客户时自动分配唯一编号 customerNumber = nextCustomerNumber++; } // 带参构造 customerData(string lName, string fName, string addr, string pCity, string pState, int zCode, string pPhone, bool mailing) : PersonData(lName, fName, addr, pCity, pState, zCode, pPhone), mailingList(mailing) { customerNumber = nextCustomerNumber++; } // 访问器 int getCustomerNumber() { return customerNumber; } bool isMailingList() { return mailingList; } // 修改器 void setMailingList(bool mailing) { mailingList = mailing; } }; // 静态成员类外初始化,初始编号可按需调整 int customerData::nextCustomerNumber = 1001; int main() { vector<customerData> customerList; ifstream inputFile("CustomerInfo.txt"); // 判断文件是否打开成功 if (!inputFile.is_open()) { cout << "无法打开CustomerInfo.txt文件,请检查文件路径!" << endl; return 1; } string line; // 逐行读取客户数据 while (getline(inputFile, line)) { if (line.empty()) continue; // 跳过空行 stringstream ss(line); string field; vector<string> fields; // 按逗号分割每行的字段 while (getline(ss, field, ',')) { fields.push_back(field); } // 字段数量不足8条说明数据格式错误,跳过 if (fields.size() < 8) continue; // 创建临时客户对象,通过setter赋值 customerData tempCust; tempCust.setLastName(fields[0]); tempCust.setFirstName(fields[1]); tempCust.setAddress(fields[2]); tempCust.setCity(fields[3]); tempCust.setState(fields[4]); tempCust.setZip(stoi(fields[5])); // 字符串转int类型邮编 tempCust.setPhone(fields[6]); // 解析bool类型的邮寄列表标记 bool mailFlag = (fields[7] == "true" || fields[7] == "1"); tempCust.setMailingList(mailFlag); // 加入客户数组 customerList.push_back(tempCust); } inputFile.close(); // 打印所有愿意加入邮寄列表的客户信息 cout << "========== 邮寄列表客户信息 ==========" << endl; for (int i = 0; i < customerList.size(); i++) { customerData cust = customerList[i]; if (cust.isMailingList()) { cout << "\n客户编号:" << cust.getCustomerNumber() << endl; cout << "姓名:" << cust.getFirstName() << " " << cust.getLastName() << endl; cout << "地址:" << cust.getAddress() << endl; cout << "城市:" << cust.getCity() << endl; cout << "州:" << cust.getState() << endl; cout << "邮编:" << cust.getZip() << endl; cout << "联系电话:" << cust.getPhone() << endl; cout << "------------------------------------" << endl; } } return 0; }
代码说明
- 静态成员
nextCustomerNumber会在每次创建新客户对象时自动自增,分配全局唯一的客户编号,无需手动硬编码编号值 - 文件读取逻辑自动跳过空行、字段缺失的错误行,避免运行崩溃
- 所有客户数据存储在
vector动态数组中,无需提前固定客户总数,适配任意条数的客户数据 - 遍历数组时仅筛选
mailingList为true的客户打印信息,完全符合作业要求
内容的提问来源于stack exchange,提问作者Nicole Chesnutt
相关产品推荐
相关产品推荐

