我正在使用Accelerated C ++解决问题4-6。该问题要求我重写Student_info
结构,read()
函数和grade()
函数,以便立即计算最终成绩,然后将其存储为Student_info
中的唯一成绩
此前,该计划的工作如下:
read()
从输入流中读取并将数据存储到Student_info
对象grade()
对象上调用Student_info
使用新约束我觉得我必须结合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);
}
答案 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
,但我的实现具有事务语义:它可以读取整个结构,也可以单独保留,以防万一阅读所有字段。