如何将文件每行数字存入vector<vector<int>>?解决getline多分隔符问题
解决将文件每行数据存入
vector<vector<int>>的问题 我来帮你搞定这个需求!你的核心目标是把文件里的每一行数据转换成一个整数数组(vector<int>),再把所有行的结果汇总到vector<vector<int>>里对吧?咱们先拆解原代码的问题,再给出正确的实现方案。
原代码的问题分析
- 返回类型不匹配:你需要的是
vector<vector<int>>,但原函数返回的是vector<int>,根本没法返回每行的二维结构 - 嵌套
getline逻辑错误:内层的getline(mojplik, line, ' ')会直接从文件流里按空格分割内容,完全忽略了换行符的存在,导致整个文件被拆成一堆零散的字符串,而不是按行处理 - 多分隔符处理缺失:原代码只指定了空格作为分隔符,没法处理其他空白字符(比如制表符),也没有高效的多分隔符处理方式
正确实现方案
最简洁高效的方式是用stringstream来处理每行内容——它会自动跳过所有空白分隔符(空格、制表符、换行符等),完美解决多分隔符的问题。以下是修正后的代码:
#include <vector> #include <fstream> #include <sstream> #include <string> #include <iostream> // 用于cout输出错误信息 vector<vector<int>> czytajplik() { vector<vector<int>> zajecia; // 最终的二维容器 ifstream mojplik("dane.txt"); // 先检查文件是否成功打开 if (!mojplik.is_open()) { std::cout << "Unable to open file" << std::endl; return zajecia; // 返回空容器表示读取失败 } string line; // 逐行读取文件内容 while (getline(mojplik, line)) { vector<int> current_row; // 存储当前行的所有整数 stringstream line_stream(line); // 将当前行转为字符串流 int num; // 从字符串流中读取所有整数,自动跳过空白分隔符 while (line_stream >> num) { current_row.push_back(num); } // 可选:跳过空行(如果文件里有空行的话) if (!current_row.empty()) { zajecia.push_back(current_row); } } mojplik.close(); return zajecia; }
代码说明
- 返回类型修正:直接把函数返回类型改成
vector<vector<int>>,符合你的目标容器类型 - 逐行处理逻辑:外层
getline负责读取每一行,确保每行的数据被单独处理 - 多分隔符处理:
stringstream的>>运算符会自动忽略所有空白字符,不管是空格、制表符还是多个连续的空格,都能正确分割出整数 - 简洁性:省去了原代码中多余的中间容器(
text和textnumery),直接从字符串流转成整数存入容器,效率更高
扩展:处理自定义分隔符
如果你的文件里除了空白,还有其他分隔符(比如逗号,),可以用getline配合字符串流来处理:
// 假设当前行用逗号分隔,比如"1,2,3,4" string token; while (getline(line_stream, token, ',')) { // 把token转成整数,注意要处理可能的空白(比如逗号前后的空格) int num = std::stoi(token); current_row.push_back(num); }
内容的提问来源于stack exchange,提问作者warmeen
相关产品推荐
相关产品推荐

