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

如何使用ifstream将CSV/txt文件的逗号分隔值读取到Struct结构体对象中

实现方案

当然可以使用ifstream完成txt/csv文件读取和Company对象生成,以下是兼顾易用性和性能的实现方式:

1 前置调整

你当前定义的结构体成员顺序和CSV文件的列顺序不一致,建议先调整结构体定义方便后续赋值:

#include <string>

struct Company {
    std::string company_name;
    std::string abbreviation;
    int purchase_level;
    double price;
    double inflation_rate;
    double deflation_rate;
};

2 完整实现代码

需要引入的头文件:

#include <fstream>
#include <vector>
#include <sstream>
#include <algorithm>

先写一个辅助工具函数,用于去除字段前后的空格:

// 去除字符串前后空白符
std::string trim(const std::string& s) {
    auto start = s.begin();
    while (start != s.end() && std::isspace(*start)) start++;
    auto end = s.end();
    do {
        end--;
    } while (std::distance(start, end) > 0 && std::isspace(*end));
    return std::string(start, end + 1);
}

核心读取函数,调用后直接返回所有Company对象的集合:

std::vector<Company> read_companies(const std::string& file_path) {
    std::vector<Company> companies;
    std::ifstream file(file_path);
    if (!file.is_open()) {
        // 可根据需求添加文件打开失败的异常抛出或错误提示
        return companies;
    }

    std::string line;
    while (std::getline(file, line)) {
        // 跳过空行和//开头的注释行
        if (line.empty() || (line.size() >= 2 && line[0] == '/' && line[1] == '/')) {
            continue;
        }

        std::stringstream ss(line);
        std::string field;
        Company comp;

        // 按逗号逐字段读取
        std::getline(ss, field, ',');
        comp.company_name = trim(field);

        std::getline(ss, field, ',');
        comp.abbreviation = trim(field);

        std::getline(ss, field, ',');
        comp.purchase_level = std::stoi(trim(field));

        std::getline(ss, field, ',');
        comp.price = std::stod(trim(field));

        std::getline(ss, field, ',');
        comp.inflation_rate = std::stod(trim(field));

        std::getline(ss, field, ',');
        comp.deflation_rate = std::stod(trim(field));

        companies.push_back(std::move(comp));
    }

    file.close();
    return companies;
}

3 主函数调用示例

int main() {
    std::vector<Company> company_list = read_companies("file.txt");
    // 直接通过下标访问对应对象,和你要求的取值逻辑完全一致
    Company company_1 = company_list[0];
    // 输出测试:std::cout << company_1.abbreviation << std::endl; 输出CONE
    return 0;
}

效率优化建议

  • 如果处理的是万行以上的大文件,可以提前调用companies.reserve(预估行数)减少vector扩容的开销
  • 不需要修改对象的场景下,访问时使用引用const Company& comp = company_list[i]避免拷贝

内容的提问来源于stack exchange,提问作者rishisant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:45:11