如何在 c++ 中从字符串向量设置类对象

How to set class objects from vector of string in c++

本文关键字:向量 设置 对象 字符串 c++      更新时间:2023-10-16

这些是我的登录.csv文件中的数据:

ID,姓名,密码,性别

1,利亚姆,1234,M

2,珍妮丝,0000,F

因此,我可能会使用类和对象来创建登录详细信息,并将其写入文件中。之后,我将文件中的csv拆分为字符串向量,从那里如何将详细信息加载回类的对象。

这是我从文件中拆分csv的代码:

int _tmain(int argc, _TCHAR* argv[])
{    
string line;
ifstream fin("users.csv");
while (getline(fin, line)){
vector<string> token;
split(line, ',', token);
for (int i = 0; i < token.size(); i++){
cout << token[i] << " ";
//////////// <<here>>
}
cout << endl;
}
system("pause");
return 0;
}
void split(const string& s, char c, vector<string>& v) {
string::size_type i = 0;
string::size_type j = s.find(c);
while (j != string::npos) {
v.push_back(s.substr(i, j - i));
i = ++j;
j = s.find(c, j);
if (j == string::npos)
v.push_back(s.substr(i, s.length()));
}
}

我在想如何将拆分的字符串从字符串向量设置为对象向量,如下所示:(在此处放入<<>>我在上面评论的部分)

vector<Login>loginVector;
//all the objects below should set from string vector (token)
loginVector[i].setID(); //i=0, id=1, name=Liam, password=1234, gender=M
loginVector[i].setName();
loginVector[i].setPassword();
loginVector[i].setGender();
loginVector[i].setID(); //i=1, id=2, name=Janice, password=0000, gender=M
loginVector[i].setName();
loginVector[i].setPassword();
loginVector[i].setGender();

谢谢。

实现您的Login对象并将其填充到循环中。

struct Login {
enum Gender {
Male,
Female
};
int Id;
std::string Name;
std::string Password;
/* you should probably use a constructor */
};
/* to construct your vector */
int I = 0;
while(I < token.size()) {
/* in your iterator */
Login& LO = loginVector.emplace_back(Login{});
LO.Id = std::stoi(token[++I]);
LO.Name = token[++I];
/* etc...*/
}

请注意,这假设您的CSV格式正确,由您实施所有检查并确保处理极端情况,例如可能的错误stoi,空白行或缺少列。

另外,不要做system("pause");,你正在执行一个 shell 为你睡觉,与只使用sleep相比,它有很大的开销,它实际上做了同样的事情,只是以更直接的方式。

我个人会通过为您的类添加一个提取运算符来实现这一点。 您必须friend提取运算符,因为它必须在类外部定义,因为它实际上是在istream上运行的,而不是在您的类上运行的,因此应该在您的类中定义类似的东西:

friend istream& operator>> (istream& lhs, Login& rhs);

根据变量的命名方式,提取运算符应如下所示:

istream& operator>> (istream& lhs, Login& rhs) {
char gender;
lhs >> rhs.id;
lhs.ignore(numeric_limits<streamsize>::max(), ',');
getline(lhs, rhs.name, ',');
getline(lhs, rhs.password, ',');
lhs >> ws;
lhs.get(gender);
rhs.isMale = gender == 'm' || gender == 'M';
return lhs;
}

现场示例