You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:21:01