我想写一个通用函数来解析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
}
2条答案
按热度按时间soat7uwm1#
问题是
for
循环:表达式
std::istringstream(source.data())
在循环的每次迭代中从头创建一个全新的istringstream
对象。您永远不会超过输入字符串source
的第一行。你需要在循环之前创建字符串流,然后在循环中使用它:
另一点:术语“条件”意指“条件”。条件不是空的,是第三个“表达式”子句是空的。条件是
std::getline
调用。xriantvc2#
每次迭代都创建一个新的
istringstream
,因此从它阅读一行永远不会到达末尾。您只想构造一个流:Live Demo