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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:18:29