CSV解析函数死循环:while循环中string stream无法终止问题排查
问题分析与修复方案
核心错误(导致无限循环)
在for循环的条件判断部分,每次迭代都会新建一个std::istringstream(source.data())对象。这意味着每次调用std::getline时,都是从源字符串的起始位置开始读取,永远只会获取到第一行,外层循环因此无限重复。
次要问题
变量名拼写错误:reult应为result,否则无法正确返回解析结果;同时原代码缺少将解析字段存入结果向量的逻辑。
修复后的代码
#include <vector> #include <string> #include <sstream> #include <iostream> std::vector<std::vector<std::string>> parseCsvFile(std::string_view source, char valueSeparator) { auto result = std::vector<std::vector<std::string>>(); // 将流对象移到循环外,仅创建一次,保证读取位置持续后移 std::istringstream sourceStream(source.data()); for(std::string line; std::getline(sourceStream, line);) { std::istringstream stream(line); std::string token; std::vector<std::string> currentRow; while(std::getline(stream, token, valueSeparator)) { std::cout << token << "\n"; currentRow.push_back(token); } result.push_back(currentRow); } return result; } void test() { auto testData = std::string("a,b,c,d\ne,f,g,h\n"); const auto data = parseCsvFile(testData, ','); }
修复要点
- 将
std::istringstream的创建移至for循环外部,确保整个解析过程使用同一个流对象,读取位置会随getline调用自动后移,避免重复读取第一行。 - 修正变量名拼写错误,添加字段存储逻辑,将每行解析结果存入结果向量。
内容的提问来源于stack exchange,提问作者DEKKER
相关产品推荐
相关产品推荐

