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

从CSV读取IP地址并存储至std::vector<L3Address>的代码实现需求

没问题,我来帮你搞定这个CSV读取IP地址的需求!下面是完整的实现方案,包含了常见场景的处理(比如空行、多余空格、无效IP),直接就能用~

完整实现方案:从CSV读取IP地址到std::vector

核心思路

  1. 用C++标准库的文件流打开并逐行读取CSV文件
  2. 处理每行内容:支持每行单个IP或一行多个逗号分隔的IP
  3. 修剪IP字符串的前后空白,避免格式问题
  4. 将合法的IP字符串转换为L3Address对象,加入目标vector
  5. 加入错误处理,应对文件打开失败、无效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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:43:22