C++中如何将CSV拆分得到的字符串向量赋值给类对象
嘿,这事儿不难,我来一步步教你怎么把CSV里的内容加载到类对象里~
1. 先定义对应的User类
首先你得有一个和CSV字段匹配的类,把ID、Name这些属性都封装进去,顺便写个构造函数,方便直接用拆分后的字符串向量初始化对象:
#include <string> #include <vector> using namespace std; class User { public: int id; string name; string password; char gender; // 用拆分后的字段向量初始化对象 User(const vector<string>& fields) { // 先确保字段数量正确,避免越界 if (fields.size() != 4) { throw invalid_argument("字段数量不匹配"); } id = stoi(fields[0]); // 把字符串ID转成int name = fields[1]; password = fields[2]; gender = fields[3][0]; // 取性别字符串的第一个字符(M/F) } // 可选:写个打印函数,方便验证加载是否成功 void showInfo() { cout << "ID: " << id << " | 姓名: " << name << " | 性别: " << gender << endl; } };
2. 完善CSV读取与对象加载逻辑
你已经在拆分CSV行成字符串向量了,接下来只要把每个向量转换成User对象,再存到一个容器里就行。如果还没有拆分字符串的函数,我给你补一个简单的实现:
#include <iostream> #include <fstream> #include <sstream> // 辅助函数:按逗号分割字符串成向量 vector<string> splitString(const string& input, char delimiter) { vector<string> result; string token; istringstream stream(input); while (getline(stream, token, delimiter)) { result.push_back(token); } return result; } int main() { vector<User> userList; // 存储所有用户对象的容器 ifstream file("Login.csv"); // 先检查文件能不能打开 if (!file.is_open()) { cerr << "Error: 打不开Login.csv文件!" << endl; return 1; } string line; // 跳过第一行表头(ID,Name,Password,Gender) getline(file, line); // 逐行读取并转换 while (getline(file, line)) { vector<string> fields = splitString(line, ','); try { User newUser(fields); userList.push_back(newUser); newUser.showInfo(); // 打印验证 } catch (const exception& e) { cerr << "处理行失败: " << line << " | 错误信息: " << e.what() << endl; } } file.close(); // 现在userList里就有所有从CSV加载的用户对象了,随便用~ return 0; }
几个要注意的细节
- 一定要跳过CSV的表头行,不然会把"ID"这种字符串转成int的时候报错
- 转换ID用
stoi的时候,如果CSV里的ID不是合法整数,会抛出异常,所以加了try-catch来处理这种错误情况 - 如果你的CSV字段里可能包含逗号(比如名字是"Liam, Jr."),那这个简单的split函数就不行了,得用更专业的CSV解析逻辑,但看你的示例数据没有这种情况,暂时用这个就够
- 记得包含必要的头文件,不然编译会报错
内容的提问来源于stack exchange,提问作者JoJo
相关产品推荐
相关产品推荐

