C++读取.csv文件仅返回最后一行且不显示平均分和等级问题求助
问题排查及修复方案
存在的问题:
- 输出逻辑放在读取循环外部,每次循环都会覆盖读取的分数变量,循环结束后仅保留最后一行的数值,导致仅输出最后一行
- 输出时
getAvg、getGrade是函数名,没有加参数调用,实际输出的是函数的内存地址,而非计算后的平均分和等级 - 变量命名冲突:全局域定义了int类型的
testScore1~testScore5,main函数中又定义了同名的string类型变量,导致参数传递类型不匹配 - 缺少
<iomanip>头文件,setw格式化函数无法正常生效 - 平均分计算存在整数截断:5个int值相加后直接做整数除法,会丢失小数部分
- 循环读取条件不严谨,使用
myFile.good()作为判断条件可能出现最后一行重复读取的问题
修复后代码:
#include <iostream> #include <fstream> #include <iomanip> #include <string> using namespace std; double avg; char grade; double getAvg(int t1, int t2, int t3, int t4, int t5){ avg = (double)(t1 + t2 + t3 + t4 + t5)/5; return avg; } char getGrade(double avg){ if (avg >= 90){ grade = 'A'; }else if (avg >= 80){ grade = 'B'; }else if (avg >= 70){ grade = 'C'; }else if (avg >= 60){ grade = 'D'; }else{ grade = 'F'; } return grade; } int main(){ ifstream myFile; myFile.open("scores.csv"); if(!myFile.is_open()){ cout << "Error" << endl; return 1; } cout<< setw(15) <<" Test scores"<<endl; cout<<"--------------------"<<endl; cout<< " 1 2 3 4 5 Avg Grade"<<endl; cout<<"=== === === === === ===== ====="<<endl; string s1, s2, s3, s4, s5; while (getline(myFile, s1, ',') && getline(myFile, s2, ',') && getline(myFile, s3, ',') && getline(myFile, s4, ',') && getline(myFile, s5, '\n')) { int t1 = stoi(s1), t2 = stoi(s2), t3 = stoi(s3), t4 = stoi(s4), t5 = stoi(s5); double curAvg = getAvg(t1, t2, t3, t4, t5); char curGrade = getGrade(curAvg); cout<< " "<< t1<< " "<< t2 << " "<< t3 << " "<< t4 << " "<< t5 << " " << fixed << setprecision(1) << curAvg << " " << curGrade <<endl; } myFile.close(); return 0; }
修复说明:
- 把输出逻辑移到循环内部,读取一行计算一行输出一行,不需要使用数组存储所有行数据,符合要求
- 修正函数调用写法,传入对应参数获取计算结果后输出
- 修复变量命名冲突问题,将读取的字符串变量改名,转成int后传给计算函数
- 修正平均分计算逻辑,强制转换为double做除法保留小数
- 优化循环读取条件,避免无效读取
内容的提问来源于stack exchange,提问作者Welt
相关产品推荐
相关产品推荐

