如何使用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
相关产品推荐
相关产品推荐

