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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:47:28