C++读取CSV文件段错误提示memmove-vec-unaligned-erms.S不存在如何解决
问题根因
你遇到的段错误和out_of_range异常都是二维vector越界访问导致的,具体有3个核心问题:
- 第二个写入循环的列索引
j未逐行重置:j只在进入写入循环前初始化一次,处理完第一行后j已经等于列数,第二行开始写入时直接从超过列数的索引位置写入,必然触发越界。 - 行列变量和vector实际大小不匹配:从你给出的类定义来看,你的
setRow、setColumn函数大概率只修改了row、column两个int成员变量的值,没有同步对cellcontainer执行resize操作,二维vector的实际大小和你记录的行列数完全不匹配,访问超过vector实际大小的索引自然触发异常。 - 列数统计错误:第一个预扫描循环统计每行的列数时,初始值
cols = 1,每读到一个字段就+1,最终统计出来的数值比真实列数多1,就算你正确调整了vector大小,也会多分配冗余的列空间。
修复方案
第一步:修正setRow、setColumn实现
先保证修改行列数时同步调整vector的实际大小:
void Table::setRow(int new_row) { row = new_row; // 调整总行数 cellcontainer.resize(row); // 保证所有行的列数和当前column值一致 for (auto& row_vec : cellcontainer) { row_vec.resize(column); } } void Table::setColumn(int new_col) { column = new_col; // 调整每一行的列数 for (auto& row_vec : cellcontainer) { row_vec.resize(column); } }
第二步:修正read_file函数逻辑
修复列数统计、j未重置的问题,同时加上状态重置避免旧数据干扰:
void Table::read_file(std::string f_str) { std::fstream file; std::string line; file.open(f_str, std::ios::in); if (!file) { incorrect_input(); return; } // 先清空原有表格状态 setRow(0); setColumn(0); // 预扫描调整表格大小 while (std::getline(file, line)) { std::istringstream iss(line); std::string result; int cols = 0; // 初始值改为0,统计真实列数 while (std::getline(iss, result, sep)) { cols++; } if (getColumn() < cols) { setColumn(cols); } setRow(getRow() + 1); } file.clear(); file.seekg(0, std::ios_base::beg); // 写入内容 int i = 0; while (std::getline(file, line)) { std::istringstream iss(line); std::string result; int j = 0; // j放到行循环内部,每处理一行自动重置为0 while (std::getline(iss, result, sep)) { cellcontainer.at(i).at(j) = result; j += 1; } i += 1; } file.close(); }
内容的提问来源于stack exchange,提问作者originalmartin97
相关产品推荐
相关产品推荐

