stringstream的while循环重复输出最后记录,学生成绩程序如何修复?
问题:stringstream循环中最后一条记录重复输出
程序读取学生的姓氏(lastName)、名字(firstName)、期中成绩1(midScore1)、期中成绩2(midScore2)及期末成绩(finalScore),通过计算三者平均分评定A-F等级。
示例输入:
Barrett Edan 70 45 59 Bradshaw Reagan 96 97 88
预期输出:
Barrett Edan 70 45 59 F Bradshaw Reagan 96 97 88 A
实际输出:
Barrett Edan 70 45 59 F Bradshaw Reagan 96 97 88 A Bradshaw Reagan 96 97 88 A
相关代码:
while (!studentInfo.eof()) { float avgScore = 0; studentInfo >> lastName >> firstName >> midScore1 >> midScore2 >> finalScore; avgMid1 += midScore1; avgMid2 += midScore2; avgFinal += finalScore; avgScore = (midScore1 + midScore2 + finalScore)/3; if (avgScore >= 90) { grade = "A"; } else if (avgScore >= 80 && avgScore < 90) { grade = "B"; } else if (avgScore >= 70 && avgScore < 80) { grade = "C"; } else if (avgScore >= 60 && avgScore < 70) { grade = "D"; } else if (avgScore < 60) { grade = "F"; } newFile << lastName << " " << firstName << " " << midScore1 << " " << midScore2 << " " << finalScore << " " << grade << endl; ++count; }
问题原因
while (!studentInfo.eof())的判断逻辑存在缺陷:当程序读取完最后一条有效记录后,eof()标志不会立刻被触发。此时循环会再次执行,进入循环体后尝试读取数据会失败,但lastName、firstName、成绩等变量仍保留着上一次的内容,导致最后一条记录被重复计算并输出。
修复方法
将读取操作直接放到while循环的条件中,利用>>运算符的返回值判断读取是否成功。当读取失败(比如到达流末尾)时,循环直接退出,不会执行无效的循环体内容。
修改后的代码
float avgScore = 0; while (studentInfo >> lastName >> firstName >> midScore1 >> midScore2 >> finalScore) { avgMid1 += midScore1; avgMid2 += midScore2; avgFinal += finalScore; avgScore = (midScore1 + midScore2 + finalScore)/3; if (avgScore >= 90) { grade = "A"; } else if (avgScore >= 80 && avgScore < 90) { grade = "B"; } else if (avgScore >= 70 && avgScore < 80) { grade = "C"; } else if (avgScore >= 60 && avgScore < 70) { grade = "D"; } else { grade = "F"; } newFile << lastName << " " << firstName << " " << midScore1 << " " << midScore2 << " " << finalScore << " " << grade << endl; ++count; }
额外优化:最后一个条件可以直接用else代替else if (avgScore < 60),逻辑更简洁。
内容的提问来源于stack exchange,提问作者Nicholas Davies
相关产品推荐
相关产品推荐

