Вот данные в моем файле Login.csv:
ID, имя, пароль, Пол
1, Ли, 1234, М
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");
вы запускаете оболочку для сна, которая имеет огромные накладные расходы по сравнению с просто использованием 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;
}