阅读然后处理流数据

时间:2013-04-17 11:01:45

标签: c++ stream

我正在使用Accelerated C ++解决问题4-6。该问题要求我重写Student_info结构,read()函数和grade()函数,以便立即计算最终成绩,然后将其存储为Student_info中的唯一成绩

此前,该计划的工作如下:

  1. read()从输入流中读取并将数据存储到Student_info对象
  2. 将每个对象添加到矢量
  3. 读取并添加每个对象后,将在向量中的每个grade()对象上调用Student_info
  4. 使用新约束我觉得我必须结合read()grade()函数,因此不需要存储中间成绩。问题是当从流中读取时我不知道我已经遇到了文件的末尾,直到我这样做。执行此操作时,我尝试在文件数据末尾调用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);
    }
    

1 个答案:

答案 0 :(得分: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,但我的实现具有事务语义:它可以读取整个结构,也可以单独保留,以防万一阅读所有字段。