C++读取CSV至二维数组异常:行重复读取30次求助
问题分析与解决方案
看起来你遇到的重复输出问题,根源出在输出二维数组的循环逻辑错误上,而不是CSV读取的部分哦!
核心错误点
你看这段输出代码:
for(int i=0;i<vec.size();i++) { for(int j=0;j<vec.size();j++) { // 这里误用了行数作为列数的循环条件 cout<<vec[i][j]<<"\t\t"; } cout<<endl; }
vec.size()是二维数组的总行数,但每行的元素个数(列数)应该是vec[i].size()。当你用行数来遍历列的时候,会触发数组越界访问:如果列数少于行数,程序会读取内存中的垃圾数据,看起来就像是内容重复;如果列数多于行数,则会直接漏掉后面的有效元素。
修正后的完整代码
我帮你调整了输出逻辑,同时添加了一些细节优化(比如跳过空行、避免空单元格转换):
#include <iostream> #include <fstream> #include <sstream> #include <string> #include <cmath> #include <limits> #include <iomanip> #include <vector> using namespace std; int main() { cout<<setprecision(10); ifstream myfile("Salary_Data.csv"); vector<vector<double> > vec; string line; while(getline(myfile,line)) { // 跳过空行,避免生成空的行向量 if(line.empty()) continue; stringstream lineStream(line); string cell; vector<double> temp_vec; while(getline(lineStream, cell, ',')) { // 跳过空单元格,避免转换出错 if(!cell.empty()) { temp_vec.push_back(atof(cell.c_str())); } } // 只添加非空的行向量到二维数组 if(!temp_vec.empty()) { vec.push_back(temp_vec); } } // 修正输出循环:用当前行的列数作为内层循环条件 for(int i=0;i<vec.size();i++) { for(int j=0;j<vec[i].size();j++) { cout<<vec[i][j]<<"\t\t"; } cout<<endl; } // 可以打印行列数验证读取结果是否正确 cout << "\n读取到的行数:" << vec.size() << endl; if(!vec.empty()) { cout << "每行的列数:" << vec[0].size() << endl; } return 0; }
额外注意事项
- 如果你的
Salary_Data.csv第一行是表头(比如YearsExperience,Salary),记得在读取时跳过这一行,否则会把表头字符串转换成0.0,影响后续线性回归模型的输入; atof遇到无法转换的字符串时会返回0.0,如果需要更严格的错误处理,可以换成stod并捕获异常:try { temp_vec.push_back(stod(cell)); } catch(const invalid_argument& e) { cerr << "无法转换的单元格内容:" << cell << endl; }
内容的提问来源于stack exchange,提问作者Anestis Kastellos
相关产品推荐
相关产品推荐

