解析向量c ++中的字符串

时间:2015-01-24 20:39:57

标签: c++

我有一个文本文件:

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);
}

2 个答案:

答案 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