我有一个文本文件:
bob,10,20,30
joe,50,60,50
shelly,20,15,29
我想读入学生类型的矢量,定义:
class student
{
public:
string name;
int exam1;
int exam2;
int exam3;
student (string s, int x, int y, int z)
{
name = s;
exam1 = x;
exam2 = y;
exam3 = z;
}
};
使用迭代器begin()和end(),我能够逐行存储字符串,但我希望能够解析这些字符串以存储学生姓名和他/她的考试成绩,但我不知道不知道可以做到。
我从字符串类中读到了'find'和'substr',但我对迭代器和向量一般都是新手。当它是类型时,如何使用'find'和'substr'解析向量?我知道我的代码或思考中可能已经存在很多错误。
主:
int main()
{
//Open file and create iterator
ifstream file ("test.txt");
istream_iterator<string> begin (file), end;
vector<student> vec (begin, end);
}
答案 0 :(得分:4)
为了让标准C ++库为您解析字符串,为>>
类提供自定义输入运算符student
:
istream &operator >>( istream &input, student &res ) {
string s;
int x, y, z;
char comma; // Ignored
getline(input, s, ',');
input >> comma >> x >> comma >> y >> comma >> z;
res = student(s, x, y, z);
return input;
}
此实现效率低于可能,因为它需要复制。您可以通过直接写入student
字段来提高效率,因为它们是公开的:
istream &operator >>( istream &input, student &res ) {
getline(input, res.name, ',');
char comma; // Ignored
input >> comma >> res.exam1 >> comma >> res.exam2 >> comma >> res.exam3;
return input;
}
最后,您可以将字段设为私有,并声明operator >>
friend
类的student
{{1}}。
答案 1 :(得分:-1)
cucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjg hjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjggcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjg