【问题标题】:No error in code but the data is not being written in output txt [closed]代码没有错误,但数据未写入输出 txt [关闭]
【发布时间】:2021-12-04 20:36:39
【问题描述】:

我尝试为我的作业编写代码。它没有显示任何错误,但是当我从文件中读取输入时,将它们保存在对象数组中,然后,我试图将写入值放入输出文件。数据是我想写的那个对象,但输出txt中没有写任何东西。我找不到问题。

输入的txt文件格式

2 //number of students
3 // number of grades (per student)
Student1 99 87 90 // / name grade grade grade
Student2 50 67 95

代码写在下面

#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 = "\0";
        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;
    }
    float getAVG()
    {
        return avg;
    }
    string getName()
    {
        return name;
    }

};

int main()
{
    char ch = '\0';
    char pre = '\0';
    Student S[3];
    int totalstudents = 0;
    int totalgrades = 0;
    cout << "Enter file name including " ", e.g \"myFile.txt\" :"  << endl;
    string file;
    cin >> file;
    fstream myFile;
    int loop = 0;
    int loop2 = 0;
    myFile.open(file);
    {
        while (myFile.get(ch))
        {
            if (loop != 1)
            {
                myFile >> totalstudents >> totalgrades;
                loop++;
            }
            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();
            loop2++;
            if (loop2 == totalstudents)
                break;
        }
    }
    myFile.close();
    fstream myFile2;
    myFile2.open("fout.txt");
    {
        for (int loop = 0; loop < totalstudents; loop++)
        {
            myFile << S[loop].getName() << "\t" << S[loop].getAVG() << endl;
        }
    };
    myFile2.close();
    _getch();

}

【问题讨论】:

  • 使用调试器找出你的代码在做什么。不要只在调试器中运行您的代码,一次单步执行 1 行代码,查看变量并在每个步骤中流动。

标签: c++ visual-studio-2010 visual-c++


【解决方案1】:
while (myFile.get(ch))

get() 从文件中读取一个字符。它现在已经被阅读,永远不会再被阅读。不幸的是,后续代码仍然希望初始内容存在,并希望从此时开始读取。

这是未能产生预期结果的基本逻辑错误。您将需要完全重新设计问题的输入读取部分,以修复不正确的逻辑。

由于某种原因,当前的逻辑将读取初始 totalstudentstotalgrades 的代码作为读取每个学生数据的循环的一部分塞进了代码。这不必要地使逻辑复杂化。简单地阅读这个,首先,然后是一个循环来读取每个学生的数据,就足够了。不幸的是,显示的代码存在其他基本问题,需要进行更彻底的检查才能正确修复。

显示的代码只能处理不超过三个学生的数据,并且经过硬编码以处理每个学生的三个年级。

从作业的描述中可以清楚地看出,您的程序应处理任何名学生、2 名学生、3 名学生或 100 名学生;和任何每个学生的成绩,并不总是准确的三个成绩。否则,无论如何都没有理由在输入数据中提供这些值。

不幸的是,使用当前程序的类和逻辑是不可能的,这也需要解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多