从文件读取到不同的类对象

Reading from file to different class objects

本文关键字:对象 文件 读取      更新时间:2023-10-16

我是C++编码的初学者,我有一个关于将文件中的行读取到特定类对象(其中一个是数组)的问题。

我的类对象:

const int SIZE_OF = 5;
class Student
{
public:
    Student();
    Student(const Student &);
    Student(string, int, int, int, int, int);
    friend std::istream& operator >> (std::istream& in, Student& S);
    void display();
private:
   string lastName;
   int grades[SIZE_OF];
};

定义函数的CPP文件:

Student::Student()
{
    int i;
    string lastName = "default";
    for (i = 0; i < 5; i++)
    {
        grades[i] = 0;
    }
}
Student::Student(const Student & S)
{
    int i;
    lastName = S.lastName;
    for (i = 0; i < 5; i++)
    {
        grades[i] = S.grades[i];
    }
}
Student::Student(string S, int a, int b, int c, int d, int e)
{
    lastName = S;
    grades[0] = a;
    grades[1] = b;
    grades[2] = c;
    grades[3] = d;
    grades[4] = e;
}
std::istream& operator >> (std::istream& in, Student& S)
{
    std::string line;
    std::getline(in, line);
    in >> S.lastName >> S.grades[0] >> S.grades[1] >> S.grades[2] >> S.grades[3] >> S.grades[4];
    getline(in, S.lastName);
    return in;
}
void Student::display()
{
    int i;
    int sum = 0;
    double average;
    cout << "Last Name: " << lastName << endl;
    cout << "Grades: " << endl;
    for (i = 0; i < 5; i++)
    {
        cout << grades[i] << endl;
    }
    for (i = 0; i < 5; i++)
    {
        sum = sum + grades[i];
    }
    average = sum / 5;
    cout << "Average: " << average;    
}

我需要做的是从文件中读取并将名称保存在Student类的lastName对象下。然后我需要在数组对象中保存每个等级。然后,我需要为下一个名称创建一个新的Student类对象,并对4个名称重复该过程。我正在读取的文件:

George
75,85,95,100,44
Peter
100,100,100,100,100
Frank
44,55,66,77,88
Alfred
99,88,77,66,55

您的以下函数似乎是错误的:

std::istream& operator >> (std::istream& in, Student& S)
{
    std::string line;
    std::getline(in, line);
    in >> S.lastName >> S.grades[0] >> S.grades[1] >> S.grades[2] >> S.grades[3] >> S.grades[4];
    getline(in, S.lastName);
    return in;
}

你读了两遍lastName,你不会忽略","字符。。。试试这样的东西:

std::istream& operator >> (std::istream& in, Student& S)
{
    char dummy;
    in >> S.lastName >> S.grades[0] 
       >> dummy >> S.grades[1] 
       >> dummy >> S.grades[2] 
       >> dummy >> S.grades[3] 
       >> dummy >> S.grades[4];
    return in;
}

更新:如果您考虑lastName中的空格,则必须将第一行更改为使用std::getline,如下所示:

std::istream& operator >> (std::istream& in, Student& S)
{
    char dummy;
    std::getline(in, S.lastName) 
    in >> S.grades[0] 
       >> dummy >> S.grades[1] 
       >> dummy >> S.grades[2] 
       >> dummy >> S.grades[3] 
       >> dummy >> S.grades[4];
    in.ignore(); // remove last 'n'
    return in;
}

然后:

int main()
{
    Student s;
    std::vector<Student> all;
    while (cin>>s)
      all.push_back(s);
}

和足够的更新!