1

我正在处理来自 Accelerated C++ 的问题 4-6。问题要求我重写Student_info结构、read()函数和grade()函数,以便立即计算最终成绩,然后将其作为唯一成绩存储在Student_info.

以前,该程序的工作方式如下:

  1. read()从输入流中读取数据并将数据存储到Student_info对象中
  2. 每个对象都被添加到一个向量中
  3. 一旦读取并添加了每个对象,就会在向量中的grade()每个对象上调用Student_info

有了新的约束,我觉得我必须结合read()andgrade()函数,所以没有必要存储中间等级。问题是从流中读取时,我不知道我是否遇到了文件末尾,直到我这样做。执行此操作时,我尝试在grade()文件数据末尾调用该函数。

考虑到约束是读取然后立即处理数据,我没有看到解决方法。如何处理?

struct Student_info 
{
    std::string name;
    double final_grade;
};

istream& read(istream& is, Student_info& s)
{
    double midterm, final;
    is >> s.name >> midterm >> final;

    // Error, when EOF is read, grade() will process bad data
    s.final_grade = grade(midterm, final);
    return is;
}

void main()
{
    vector<Student_info> students;
    Student_info record;
    while (read(cin, record))
        students.push_back(record);
}
4

1 回答 1

2

您可以在函数内部检查记录是否已成功读取read。例如像这样:

istream& read(istream& is, Student_info& s)
{
    string name;
    double midterm, final;

    if( is >> name >> midterm >> final ) {
        s.name = name;
        s.final_grade = grade(midterm, final);
    }

    return is;
}

请注意,您可以像在原始代码中一样直接读取s.name,但我的实现具有事务语义:它要么读取整个结构,要么不理会它,以防它无法读取所有字段。

于 2013-04-17T12:36:26.847 回答