c++ 字符串流从不在while循环中终止

ruyhziif  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(121)

我想写一个通用函数来解析CSV文件。我的代码行为非常奇怪,因为它永远不会停止并永远重复第一行。我做错了什么?

#include <vector>
#include <string>
#include <sstream>
#include <iostream>
std::vector<std::vector<std::string>> parseCsvFile(std::string_view source,
                                                   char valueSeparator) {
    auto reult = std::vector<std::vector<std::string>>();
    for(std::string line;
        std::getline(std::istringstream(source.data()), line);
        /* emoty cond */) {
        std::istringstream stream(line);
        std::string token;

        while(std::getline(stream, token, valueSeparator)) { // never ends
            // debug
            std::cout << token << "\n" << std::endl;
            // push to vector
        }
    }

    return reult;
}

void test() {
    auto testData = std::string("a,b,c,d\r\ne,f,g,h\r\n");
    const auto data = parseCsvFile(testData, ','); // Never ends
}
soat7uwm

soat7uwm1#

问题是for循环:

for(std::string line;
    std::getline(std::istringstream(source.data()), line);
    /* emoty cond */)

表达式std::istringstream(source.data())在循环的每次迭代中从头创建一个全新的istringstream对象。您永远不会超过输入字符串source的第一行。
你需要在循环之前创建字符串流,然后在循环中使用它:

std::istringstream source_stream(source.data());
for(std::string line;
    std::getline(source_stream, line);
    /* emoty cond */)

另一点:术语“条件”意指“条件”。条件不是空的,是第三个“表达式”子句是空的。条件是std::getline调用。

xriantvc

xriantvc2#

每次迭代都创建一个新的istringstream,因此从它阅读一行永远不会到达末尾。您只想构造一个流:

std::istringstream is(source.data());
for(std::string line; std::getline(is, line); ) {
       // ...

Live Demo

相关问题