C++读取行长度不同的CSV时行尾多余零问题求解
解决空格分隔CSV读取后多余零的问题
问题根源
- 你的CSV数据是空格分隔,但代码里误用逗号
,作为getline的分隔符,导致整行被当成单个字符串处理;如果行尾存在空白,atoi处理空字符串会返回0,这就是多余零的来源。 - 开头的
getline(fp, line);直接跳过了第一行数据,导致第一行的0未被正确读取。 - 打印函数里的
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
相关产品推荐
相关产品推荐

