如何将文本文件中不同数据类型存入数组并解决内存越界错误
问题修复方案
核心问题原因
- 函数仅传入裸数组指针
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
相关产品推荐
相关产品推荐

