C++使用getline填充vector读取CSV时出现函数匹配错误求助
解决std::getline编译错误及CSV数据填充vector的问题
首先来看编译错误的问题:no matching function for call to 'getline',这通常是因为编译器找不到匹配的std::getline重载,下面是几个你可以尝试的修复步骤:
1. 显式包含<string>头文件
你的代码里用了std::string和std::getline,虽然<iostream>、<fstream>可能间接包含部分string相关的定义,但C++标准并没有强制要求它们必须包含完整的<string>头文件。添加这个头文件可以确保编译器找到正确的std::getline函数:
#include <string> // 新增这行 #include "fhir/persistence/hdf/HdfStorageAdapter.h" #include <macrologger.h> #include <iostream> #include <fstream> #include <sstream>
2. 排查命名空间冲突
检查HdfStorageAdapter.h头文件中是否定义了自己的getline函数,或者使用了using namespace std;以外的命名空间,导致编译器混淆了函数名称。如果存在这种情况,可以尝试:
- 确保所有
getline调用都明确使用std::前缀(你已经这么做了,但可以再确认) - 暂时注释掉
HdfStorageAdapter.h的包含,测试编译是否正常,来排查是否是头文件冲突
额外的逻辑错误修复(避免运行时崩溃)
除了编译错误,你的代码还有一个严重的逻辑问题:初始化的std::vector<row_struct> v是空的,直接使用v[i]访问元素会导致未定义行为(比如崩溃)。正确的做法是每次循环创建一个row_struct实例,然后添加到vector中:
修改后的循环代码示例:
std::vector<row_struct> v; std::string line; std::ifstream dataInput(path.c_str()); char delimeter(','); std::string timestampTemp, millisecondsSinceStartTemp, deviceTemp, typeTemp, valueTemp; LOG_DEBUG("Reading data dump..."); // 去掉i变量,改用push_back while (std::getline(dataInput, timestampTemp, delimeter)) { std::getline(dataInput, millisecondsSinceStartTemp, delimeter); std::getline(dataInput, deviceTemp, delimeter); std::getline(dataInput, typeTemp, delimeter); std::getline(dataInput, valueTemp); // 创建临时对象 row_struct row; row.timestamp = atoi(timestampTemp.substr(1, timestampTemp.size() - 2).c_str()); row.millisecondsSinceStart = atoi(millisecondsSinceStartTemp.substr(1, millisecondsSinceStartTemp.size() - 2).c_str()); row.device = atoi(deviceTemp.substr(1, deviceTemp.size() - 2).c_str()); row.value = atof(valueTemp.substr(1, valueTemp.size() - 2).c_str()); row.type = *(typeTemp.substr(1, typeTemp.size() - 2).c_str()); // 添加到vector v.push_back(row); // 不需要手动clear字符串,下一次getline会覆盖内容 } return v;
另外,row.type = *(typeTemp.substr(1, typeTemp.size() - 2).c_str());这里要注意,如果typeTemp截取后是空字符串,会导致访问空指针的未定义行为,建议添加一个判断:
std::string typeStr = typeTemp.substr(1, typeTemp.size() - 2); row.type = typeStr.empty() ? '\0' : typeStr[0];
内容的提问来源于stack exchange,提问作者Baesm
相关产品推荐
相关产品推荐

