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

C++读取行长度不同的CSV时行尾多余零问题求解

解决空格分隔CSV读取后多余零的问题

问题根源

  1. 你的CSV数据是空格分隔,但代码里误用逗号,作为getline的分隔符,导致整行被当成单个字符串处理;如果行尾存在空白,atoi处理空字符串会返回0,这就是多余零的来源。
  2. 开头的getline(fp, line);直接跳过了第一行数据,导致第一行的0未被正确读取。
  3. 打印函数里的if (u[i].size() > 1)过滤了仅含单个元素的行,不符合你的需求。

修正后的读取函数

改用istringstream的>>运算符读取整数,它会自动跳过所有空白字符(空格、换行、制表符等),完美适配空格分隔格式,还能避免空字符串转0的问题:

#include <vector>
#include <fstream>
#include <sstream>
#include <string>

using namespace std; // 新手可先用此简化代码,熟悉后再调整命名空间使用方式

vector<vector<int>> read_multi_int(string path) {
    vector<vector<int>> user_vec;
    ifstream fp(path); 
    string line;
    
    // 移除开头多余的getline,遍历所有行
    while (getline(fp, line)) { 
        vector<int> data_line;
        istringstream readstr(line); 
        int num;
        
        // 用>>直接读取整数,自动跳过空白
        while (readstr >> num) { 
            data_line.push_back(num); 
        }
        user_vec.push_back(data_line); 
    }
    return user_vec;
}

// 调用方式不变
vector<vector<int>> path = read_multi_int("C:/Users/data/paths.csv");

修正后的打印函数

去掉过滤单个元素行的判断,同时避免每行末尾多一个空格:

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
void print_multi(const T& u) // 用const引用避免拷贝,提升效率
{
    for (size_t i = 0; i < u.size(); ++i) { // 用size_t适配容器的size类型
        const auto& row = u[i];
        for (size_t j = 0; j < row.size(); ++j) {
            if (j > 0) {
                cout << " "; // 除第一个元素外,其余元素前加空格
            }
            cout << row[j];
        }
        cout << endl; // 用endl换行,符合C++输出风格
    }
    cout << endl;
}

测试结果

运行修正后的代码,读取你提供的path.csv,打印输出会与原文件内容完全一致:

0
0 1
0 2 4
0 3 6 7

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:41:06