C++代码无报错但学生成绩数据未写入输出txt文件问题咨询
代码问题排查与修复
直接导致输出文件无内容的核心问题
你在写入数据时用错了文件流对象:声明了用于写入fout.txt的流是myFile2,但实际写入语句里用的是已经关闭的输入文件流myFile,数据根本没有写入目标文件的流中。
其余存在的问题
- 读取逻辑冗余错误:外层
while (myFile.get(ch))会提前读取输入文件的第一个字符,导致后续读取总人数、总分数的逻辑读取到错误值,后续学生数据读取也全部错位。 - 文件打开模式不明确:
fstream默认打开模式没有强制写权限,若目标输出文件不存在会打开失败,写入时建议直接用ofstream或显式指定ios::out参数。 - 平均分计算精度丢失:三个整数相加后直接除以整数3,会先进行整数除法取整再转浮点,丢失小数部分。
- 固定数组存在越界风险:声明的
Student S[3]仅支持最多3个学生,若输入人数超过3会触发内存越界。 - 输入格式适配问题:读取时默认固定读3个成绩,没有用到读取到的
totalgrades参数,若后续调整成绩数量代码会出错。
修正后完整代码
#include <iostream> #include <conio.h> #include <string> #include <fstream> using namespace std; class Student { private: string name; int grade1; int grade2; int grade3; float avg; public: Student() { name = ""; grade1 = grade2 = grade3 = avg = 0; } void setname(string Name) { name = Name; } void setgrade1(int num) { grade1 = num; } void setgrade2(int num) { grade2 = num; } void setgrade3(int num) { grade3 = num; } void AVG() { // 转浮点后再做除法避免精度丢失 avg = (grade1 + grade2 + grade3) / 3.0f; } float getAVG() { return avg; } string getName() { return name; } }; int main() { const int MAX_STUDENT = 100; // 定义最大学生数避免越界 Student S[MAX_STUDENT]; int totalstudents = 0; int totalgrades = 0; cout << "Enter file name including \"\", e.g \"myFile.txt\" :" << endl; string file; cin >> file; ifstream myFile(file); // 直接用输入流,更安全 if (!myFile.is_open()) { cout << "输入文件打开失败" << endl; _getch(); return 1; } // 去掉冗余的get(ch)循环,直接读取头两行数据 myFile >> totalstudents >> totalgrades; for(int loop2 = 0; loop2 < totalstudents && loop2 < MAX_STUDENT; loop2++) { string namE; int g1, g2, g3; myFile >> namE >> g1 >> g2 >> g3; S[loop2].setname(namE); S[loop2].setgrade1(g1); S[loop2].setgrade2(g2); S[loop2].setgrade3(g3); S[loop2].AVG(); } myFile.close(); ofstream myFile2("fout.txt"); // 直接用输出流,默认创建/覆盖文件 if (!myFile2.is_open()) { cout << "输出文件打开失败" << endl; _getch(); return 1; } for (int loop = 0; loop < totalstudents; loop++) { // 用正确的输出流对象写入 myFile2 << S[loop].getName() << "\t" << S[loop].getAVG() << endl; } myFile2.close(); _getch(); return 0; }
内容的提问来源于stack exchange,提问作者ThundeReX
相关产品推荐
相关产品推荐

