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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:24:03