文件IO循环错误

File IO loops wrongly

本文关键字:错误 循环 IO 文件      更新时间:2023-10-16

我有一个readFile函数,它应该从文本文件中识别学生的类型。如果它的国籍是本地的,它将创建一个localstudent类,并将所有细节存储到localstudentobject中,并将其push_back存储到向量中。国际学生也是如此。当我使用cout检查向量的大小如何增加时,它会显示大小增加了3倍,这意味着我的函数循环了3次。我该怎么解决这个问题?

文件中的输入

Local   Bob 1 12 2003   Female  3   34  5345    345 3131    Bob 12313   1 12 2003   12 12 2000  1231    3   3   4   115.476 1346.48 258.75  4   234
Local   Tom 1/12/2003   male    3   34  5345    345 3131    Tom 12313   1/12/2003   12/12/2000  1231    3   3   4   115.476 1346.48 258.75  4   234

输出将显示Bob一次和Tom两次的详细信息。我知道在.of()中是错误的,但我不知道有任何其他方法可以循环使用。

void readFile(vector <clsStudent*> &s)
{
    string name, IC_no,state, gender, accNumb, accName, progName, ReadNationality, progCode, passportNumber, nation, visa, scholarship;
    int accID, times;
    float GPA, discountedFees, principle, rate, years, CI, C_Amount, progFees;
    clsDate DOB, accStart, accDOB, expDate;
    string line;
    ifstream in(filename);
    while(in)
    {
       if(in)
        {
            in >> ReadNationality;
            in >> name;
            in >> DOB;
            in >> gender;
            in >> GPA;
            in >> progName;
            in >> progCode;
            in >> progFees;
            in >> accNumb;
            in >> accName;
            in >> accID;
            in >> accDOB;
            in >> accStart;
            in >> principle;
            in >> rate;
            in >> years;
            in >> times;
            in >> CI;
            in >> C_Amount;
            in >> discountedFees;
            if (ReadNationality == "Local")
            {
                clsLocalStudent *stud;
                stud = new clsLocalStudent();
                in >> IC_no;
                in >> state;
                clsUniversityProgram *program= new clsUniversityProgram(progName, progCode, progFees);
                clsAccount objAccount(accNumb,name,accID, accDOB, accStart, principle, rate, years, times);
                stud->setName(name);
                stud->setDateOfBirth(DOB);
                stud->setGender(gender);
                stud->setNationality(ReadNationality);
                stud->setGPA(GPA);
                stud->setProgram(program);
                stud->setAccounts(objAccount);
                stud->setIC(IC_no);
                stud->setState(state);
                s.push_back(stud);
            }
            else
            {
                clsInternationalStudent *stud;
                stud = new clsInternationalStudent();
                in >> passportNumber;
                in >> nation;
                in >> visa;
                in >> expDate;
                in >> scholarship;
                clsUniversityProgram program(progName, progCode, progFees);
                clsAccount objAccount(accNumb,name,accID, accDOB, accStart, principle, rate, years, times);
                stud->setName(name);
                stud->setDateOfBirth(DOB);
                stud->setGender(gender);
                stud->setNationality(ReadNationality);
                stud->setGPA(GPA);
                stud->setProgram(&program);
                stud->setAccounts(objAccount);
                stud->setPassportNo(passportNumber);
                stud->setNation(nation);
                stud->setStudentVisa(visa);
                stud->setExpiryDate(expDate);
                stud->setScholarship(scholarship);
                s.push_back(stud);
            }
        }
        else
        cerr << "nCannot open " << filename << " for reading" << endl;
    cout << s.size();
    }

    in.close();
}
void operator >> (istream &is, clsDate &date)
{
    string inputDate;
    int dd, mm, yy;
    char separator;
    is >> dd >> separator >> mm >> separator >> yy;
    date.setSeparator(separator);
    date.setMM(mm);
    date.setDD(dd);
    date.setYY(yy);
}

您期望while (in)和冗余的if (in)预测未来,并以某种方式保证未来的读取工作。当然,他们不能那样做。相反,检查每个输入操作以确保它成功,一旦其中一个失败,就中止循环。

最简单的方法可能是在上次读取之后和处理任何读取的数据之前检查in的状态。

如下更改readFile()函数,

void readFile(vector <clsStudent*> &s)
{
    string name, IC_no,state, gender, accNumb, accName, progName, ReadNationality, progCode, passportNumber, nation, visa, scholarship;
    int accID, times;
    float GPA, discountedFees, principle, rate, years, CI, C_Amount, progFees;
    clsDate DOB, accStart, accDOB, expDate;
    string line;
    ifstream in(filename);
    if (in.is_open())
    {
        while(in >> ReadNationality >> name
            >> DOB >> gender >> GPA
            >> progName >> progCode >> progFees
            >> accNumb>> accName>> accID
            >> accDOB>> accStart>> principle
            >> rate>> years>> times
            >> CI>> C_Amount>> discountedFees
        )
        {
            if (ReadNationality == "Local")
            {
                clsLocalStudent *stud;
                stud = new clsLocalStudent();
                in >> IC_no;
                in >> state;
                clsUniversityProgram *program= new clsUniversityProgram(progName, progCode, progFees);
                clsAccount objAccount(accNumb,name,accID, accDOB, accStart, principle, rate, years, times);
                stud->setName(name);
                stud->setDateOfBirth(DOB);
                stud->setGender(gender);
                stud->setNationality(ReadNationality);
                stud->setGPA(GPA);
                stud->setProgram(program);
                stud->setAccounts(objAccount);
                stud->setIC(IC_no);
                stud->setState(state);
                s.push_back(stud);
            }
            else
            {
                clsInternationalStudent *stud;
                stud = new clsInternationalStudent();
                in >> passportNumber;
                in >> nation;
                in >> visa;
                in >> expDate;
                in >> scholarship;
                clsUniversityProgram program(progName, progCode, progFees);
                clsAccount objAccount(accNumb,name,accID, accDOB, accStart, principle, rate, years, times);
                stud->setName(name);
                stud->setDateOfBirth(DOB);
                stud->setGender(gender);
                stud->setNationality(ReadNationality);
                stud->setGPA(GPA);
                stud->setProgram(&program);
                stud->setAccounts(objAccount);
                stud->setPassportNo(passportNumber);
                stud->setNation(nation);
                stud->setStudentVisa(visa);
                stud->setExpiryDate(expDate);
                stud->setScholarship(scholarship);
                s.push_back(stud);
            }
        }
        cout << s.size();
        in.close();
    }
    else
        cerr << "nCannot open " << filename << " for reading" << endl;
}