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

如何将文本文件中不同数据类型存入数组并解决内存越界错误

问题修复方案

核心问题原因

  • 函数仅传入裸数组指针Customer *customers,没有传入数组的最大可容纳元素数,当文件读取到的客户行数超过数组容量时,i 自增后访问customers[i]属于非法内存访问,直接触发内存越界错误,这是报错的核心诱因。
  • 示例文本中余额字段为浮点格式5000.00,代码使用stoi做整型转换,若Customer类的Balance成员为浮点类型,会存在精度丢失甚至类型赋值异常风险。
  • 缺少单行字段完整性校验、格式错误异常捕获逻辑,字段缺失、内容格式非法时也会触发程序异常。

修复方案

方案1:保留裸数组传参的兼容修复

修改函数签名增加数组容量参数,写入前做越界判断,同时修复余额转换逻辑、增加异常校验:

// 新增参数maxCount为传入数组的最大可容纳元素数
void AddCustomersToArray(Customer *customers, fstream& customersFile, int maxCount) {
    string line;
    int i = 0;
    string Number, FullName, DOB, Address, Telephone, Balance;

    while (i < maxCount && getline(customersFile, line)) { // 先判断是否超过数组容量
        stringstream ss(line);
        try {
            // 所有字段读取成功才赋值
            if (getline(ss, Number, ',') 
                && getline(ss, FullName, ',')
                && getline(ss, DOB, ',')
                && getline(ss, Address, ',')
                && getline(ss, Telephone, ',')
                && getline(ss, Balance, ',')) {
                
                customers[i].Number = stoi(Number);
                customers[i].FullName = FullName;
                customers[i].DOB = DOB;
                customers[i].Address = Address;
                customers[i].Telephone = Telephone;
                // 浮点类型余额用stod转换
                customers[i].Balance = stod(Balance); 
                i++;
            }
        } catch (...) {
            // 格式错误的行跳过,可自行增加日志输出
            continue;
        }
    }
}

调用该函数时需要传入你定义的数组的实际容量,比如定义了Customer cus[100],就传入maxCount=100。

方案2:更安全的vector版本(推荐)

使用std::vector代替裸数组,自动扩容完全避免越界问题:

// 传入vector引用,自动扩容不需要提前固定容量
void AddCustomersToArray(vector<Customer>& customers, fstream& customersFile) {
    string line;
    string Number, FullName, DOB, Address, Telephone, Balance;

    while (getline(customersFile, line)) {
        stringstream ss(line);
        try {
            if (getline(ss, Number, ',') 
                && getline(ss, FullName, ',')
                && getline(ss, DOB, ',')
                && getline(ss, Address, ',')
                && getline(ss, Telephone, ',')
                && getline(ss, Balance, ',')) {
                
                Customer cus;
                cus.Number = stoi(Number);
                cus.FullName = FullName;
                cus.DOB = DOB;
                cus.Address = Address;
                cus.Telephone = Telephone;
                cus.Balance = stod(Balance); 
                customers.push_back(cus);
            }
        } catch (...) {
            continue;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:45:02