文件IO循环错误
File IO loops wrongly
我有一个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;
}
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 方法内部但循环仍得到预期的不合格id错误C++
- C++ - 循环访问指针数组会导致错误
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 带有开关语句的 do-while 循环 -- 无穷循环错误
- For 循环 C++ 中的值错误
- 为什么我的 for 循环给出错误:X 没有命名类型
- 类方法 - 数据结构中 For 循环的运行时错误
- 试图避免在 for 循环中出现 if-else 语句,但代码似乎有一些错误
- 如何向用户显示特定错误,要求他/她使用循环再次提供输入?
- 循环 c++ 中的分段错误
- 虽然循环即使应用了错误条件也不会退出
- 错误 C2512 视觉C++(并且不是循环依赖项)
- 使用基于范围的指针循环和向量时出现C++错误
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 在指针迭代中使用for循环时出现分段错误
- 向量循环抛出2个错误
- for 循环说 - 错误 成员引用基类型"int [13]"不是结构或联合
- C++,查找最低值,函数错误:循环最多运行一次(循环增量从未执行)