如何修改C++代码以处理多分隔符并读取文本文件至tuple类型向量
如何修改C++代码处理「空格+竖线+空格」多分隔符的文本文件?
这问题我之前也碰到过!原代码的核心问题是stringstream的>>运算符遇到|符号时,会判定为非数字字符,导致后续字段无法正确解析。下面给你两种实用的修改方案,都能完美适配你的data.txt格式:
方案一:精确跳过分隔符(推荐)
这种方法会在读取每个字段之间,专门处理|分隔符,既精准又不会误操作其他内容:
修改后的完整代码
#include <iostream> #include <fstream> #include <sstream> #include <vector> #include <tuple> #include <algorithm> typedef std::vector<std::tuple<int, int, double>> VectorTuple; VectorTuple Readfile(std::string filename) { std::ifstream File(filename); if (!File.is_open()) { std::cerr << "File '" << filename << "' does not exist." << std::endl; exit(1); } VectorTuple data; std::string line; while (std::getline(File, line)) { std::stringstream ss(line); int a, b; double c; char separator; // 用于存储竖线分隔符 // 利用>>自动跳过空格的特性,读取a -> 跳过| -> 读取b -> 跳过| -> 读取c if (ss >> a >> separator >> b >> separator >> c) { data.emplace_back(a, b, c); // 用emplace_back替代push_back,更高效 } else { std::cerr << "Skipping invalid line: " << line << std::endl; } } return data; } int main() { std::string file = "data.txt"; auto vt = Readfile(file); std::for_each(vt.begin(), vt.end(), [](const auto& i){ std::cout << std::get<0>(i) << ", " << std::get<1>(i) << ", " << std::get<2>(i) << std::endl; }); return 0; }
关键修改点:
- 新增
char separator变量,专门接收每行中的|符号 - 调整读取逻辑为
ss >> a >> separator >> b >> separator >> c,由于>>会自动跳过前后的空格,完美匹配「空格+竖线+空格」的格式 - 加入了无效行的错误提示,方便排查问题
- 用
emplace_back替代push_back,避免临时tuple的拷贝开销
方案二:替换分隔符为空格(简单粗暴)
如果确定你的文件中只有|作为分隔符,没有其他地方出现|,可以直接把所有|替换成空格,然后复用原代码的读取逻辑:
核心修改部分
在std::stringstream ss(line);之前加入:
// 把所有|替换成空格,让原有的空格分隔读取逻辑生效 std::replace(line.begin(), line.end(), '|', ' ');
优点:
- 代码改动极小,几乎不需要调整原有的读取逻辑
- 适用于所有以
|为分隔符的文本文件,不管前后有没有空格
缺点:
- 如果文本中存在非分隔符的
|(比如字符串字段里的),会被误替换,导致数据错误
内容的提问来源于stack exchange,提问作者Gabriel90
相关产品推荐
相关产品推荐

