从CSV读取IP地址并存储至std::vector<L3Address>的代码实现需求
没问题,我来帮你搞定这个CSV读取IP地址的需求!下面是完整的实现方案,包含了常见场景的处理(比如空行、多余空格、无效IP),直接就能用~
完整实现方案:从CSV读取IP地址到std::vector
核心思路
- 用C++标准库的文件流打开并逐行读取CSV文件
- 处理每行内容:支持每行单个IP或一行多个逗号分隔的IP
- 修剪IP字符串的前后空白,避免格式问题
- 将合法的IP字符串转换为
L3Address对象,加入目标vector - 加入错误处理,应对文件打开失败、无效IP等情况
完整代码示例
首先是辅助工具函数和核心读取函数:
#include <fstream> #include <vector> #include <string> #include <sstream> #include <algorithm> #include <cctype> #include <stdexcept> #include <iostream> // 辅助函数:修剪字符串前后的空白字符(空格、制表符等) std::string trim(const std::string& s) { auto start = s.begin(); while (start != s.end() && std::isspace(static_cast<unsigned char>(*start))) { start++; } auto end = s.end(); do { end--; } while (std::distance(start, end) > 0 && std::isspace(static_cast<unsigned char>(*end))); return std::string(start, end + 1); } // 核心函数:从CSV文件读取IP地址到vector bool loadDestAddressesFromCSV(const std::string& filePath, std::vector<L3Address>& destAddresses) { // 打开文件 std::ifstream csvFile(filePath); if (!csvFile.is_open()) { throw std::runtime_error("无法打开文件: " + filePath); return false; } std::string line; // 逐行读取 while (std::getline(csvFile, line)) { // 跳过空行 if (line.empty()) continue; // 处理一行内多个逗号分隔的IP std::stringstream lineStream(line); std::string ipStr; while (std::getline(lineStream, ipStr, ',')) { std::string cleanedIp = trim(ipStr); // 跳过空的IP项(比如连续逗号的情况) if (cleanedIp.empty()) continue; try { // 将IP字符串转换为L3Address并加入vector // 这里假设L3Address支持直接从std::string构造 destAddresses.emplace_back(cleanedIp); // 如果你的L3Address用静态方法解析,比如fromString,替换为: // destAddresses.push_back(L3Address::fromString(cleanedIp)); } catch (const std::exception& e) { // 捕获无效IP的异常,打印提示后继续处理其他IP std::cerr << "跳过无效IP '" << cleanedIp << "': " << e.what() << std::endl; // 如果需要严格校验(遇到无效IP就终止),可以取消下面的注释: // csvFile.close(); // return false; } } } csvFile.close(); return true; }
然后是使用示例:
int main() { std::vector<L3Address> destAddresses; try { // 替换为你的CSV文件路径 loadDestAddressesFromCSV("ip_addresses.csv", destAddresses); std::cout << "成功读取 " << destAddresses.size() << " 个有效IP地址" << std::endl; } catch (const std::exception& e) { std::cerr << "读取失败: " << e.what() << std::endl; return 1; } // 这里可以添加对destAddresses的后续操作 // 比如遍历输出所有IP: // for (const auto& addr : destAddresses) { // std::cout << addr.toString() << std::endl; // } return 0; }
关键细节说明
- L3Address适配:请确保你的
L3Address类支持从字符串构造,或者提供了类似fromString的静态解析方法。如果是自定义类,你可以基于C++标准库或第三方工具(比如Boost.Asio)实现IP字符串的解析逻辑。 - 格式兼容性:代码兼容两种常见的CSV格式:每行一个IP,或者一行内多个IP用逗号分隔,同时自动处理IP字符串前后的空白字符。
- 错误处理:
- 文件打开失败会抛出
runtime_error,你可以根据需求改为返回错误码。 - 遇到无效IP时,默认打印警告并继续处理其他IP;如果需要严格校验,只需取消代码中的注释即可终止读取。
- 文件打开失败会抛出
- 性能优化:使用
emplace_back代替push_back,减少对象拷贝开销。
内容的提问来源于stack exchange,提问作者Saad
相关产品推荐
相关产品推荐

