C++ 文件IO循环错误
我有一个readFile函数,它应该从文本文件中识别学生的类型。如果它的国籍是本地的,它将创建一个localstudent类,并将所有细节存储到localstudent对象中,然后将_推回到向量中。国际学生也是如此。当我使用cout检查向量的大小如何增加时,它会显示大小增加了3倍,这意味着我的函数循环了3倍。我该如何解决这个问题 输入文件C++ 文件IO循环错误,c++,file-io,C++,File Io,我有一个readFile函数,它应该从文本文件中识别学生的类型。如果它的国籍是本地的,它将创建一个localstudent类,并将所有细节存储到localstudent对象中,然后将_推回到向量中。国际学生也是如此。当我使用cout检查向量的大小如何增加时,它会显示大小增加了3倍,这意味着我的函数循环了3倍。我该如何解决这个问题 输入文件 Local Bob 1 12 2003 Female 3 34 5345 345 3131 Bob 12313 1 12 20
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两次的详细信息。我知道in.eof()是错误的,但我不知道有任何其他方法可以循环实现这一点
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);
}
void readFile(向量&s)
{
字符串名称、ICU编号、州、性别、账号、账号、账号、项目名称、ReadNational、项目代码、护照号码、国家、签证、奖学金;
int accID,次;
浮动GPA、折扣费、原则、费率、年份、CI、C_金额、项目费用;
clsDate DOB、accStart、accDOB、expDate;
弦线;
ifstream-in(文件名);
当
{
如果(在)
{
在>>中阅读国籍;
以>>的名义;
在>>DOB;
在>>性别;
在>>GPA中;
在>>程序名中;
在>>程序代码中;
在>>节目费中;
在>>accNumb中;
在>>账户名称中;
在>>accID中;
在>>accDOB中;
在>>accStart中;
在>>原则中;
在>>率;
在>>年;
在>>时代;
在>>CI中;
在>>C_金额中;
在>>折扣食品中;
如果(ReadNational==“本地”)
{
clsLocalStudent*螺柱;
螺柱=新的clsLocalStudent();
在>>集成电路编号;
处于>>状态;
clsUniversityProgram*程序=新的clsUniversityProgram(程序名、程序代码、程序费);
clsAccount objAccount(accNumb、name、accID、accDOB、accStart、principle、rate、year、times);
螺柱->设置名称(名称);
螺柱->出生日期(DOB);
螺柱->设置性别(性别);
螺柱->设置国籍(ReadNational);
螺柱->设定GPA(GPA);
螺柱->设置程序(程序);
螺柱->设置帐户(对象计数);
螺柱->setIC(IC_编号);
螺柱->设置状态(状态);
s、 推回(螺柱);
}
其他的
{
clsInternationalStudent*stud;
螺柱=新clsInternationalStudent();
在>>护照号码中;
在>>国家;
在>>签证;
在>>expDate中;
在>>奖学金;
clsUniversityProgram程序(程序名称、程序代码、程序费用);
clsAccount objAccount(accNumb、name、accID、accDOB、accStart、principle、rate、year、times);
螺柱->设置名称(名称);
螺柱->出生日期(DOB);
螺柱->设置性别(性别);
螺柱->设置国籍(ReadNational);
螺柱->设定GPA(GPA);
螺柱->设置程序(&程序);
螺柱->设置帐户(对象计数);
螺柱->设置护照号码(护照号码);
螺柱->设置(国家);
螺柱->设置学生签证(visa);
螺柱->设定到期日(expDate);
奖学金(奖学金);
s、 推回(螺柱);
}
}
其他的
cerr>分离器>>mm>>分离器>>yy;
日期:设置分离器(分离器);
日期:setMM(毫米);
日期:setDD(dd);
日期:setYY(yy);
}
您希望在时以及冗余的if(in)
能够预测未来并以某种方式保证未来的读取工作。当然,他们不能这样做。相反,检查每个输入操作以确保其成功,一旦失败,就中止循环
最简单的方法可能是在最后一次读取之后和处理任何读取的数据之前检查中的状态。您期望的while(in)
,以及冗余的if(in)
预测未来并以某种方式保证未来的读取工作。当然,他们不能这样做。相反,检查每个输入操作以确保其成功,一旦一个操作失败,就中止循环
最简单的方法可能是在最后一次读取之后和处理任何读取的数据之前检查中的状态。您期望的while(in)
,以及冗余的if(in)
预测未来并以某种方式保证未来的读取工作。当然,他们不能这样做。相反,检查每个输入操作以确保其成功,一旦一个操作失败,就中止循环
最简单的方法可能是在最后一次读取之后和处理任何读取的数据之前检查中的状态。您期望的while(in)
,以及冗余的if(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;
}
void readFile(向量&s)
{
字符串名称、ICU编号、州、性别、账号、账号、账号、项目名称、ReadNational、项目代码、护照号码、国家、签证、奖学金;
int accID,次;
浮动GPA、折扣费、原则、费率、年份、CI、C_金额、项目费用;
clsDate DOB、accStart、accDOB、expDate;
弦线;
ifstream-in(文件名);
if(in.is_open())
{
而(在>>阅读国籍>>姓名中)
>>出生日期>>性别>>平均绩点
>>项目名称>>项目代码>>项目费用