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

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, ',');
}

修复要点

  1. 将std::istringstream的创建移至for循环外部,确保整个解析过程使用同一个流对象,读取位置会随getline调用自动后移,避免重复读取第一行。
  2. 修正变量名拼写错误,添加字段存储逻辑,将每行解析结果存入结果向量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:07:09