C++ While循环不读取整个ifstream文件
我的ReadFile函数没有读取我的整个文件。该文件包含与一名学生相关的信息行 函数(或者while循环)正在读取前两条记录,然后退出循环。它正在正确读取所有内容,但为什么不继续读取整个文件(其中有13条记录) 我在(!infle.eof())时尝试了C++ While循环不读取整个ifstream文件,c++,fileinputstream,C++,Fileinputstream,我的ReadFile函数没有读取我的整个文件。该文件包含与一名学生相关的信息行 函数(或者while循环)正在读取前两条记录,然后退出循环。它正在正确读取所有内容,但为什么不继续读取整个文件(其中有13条记录) 我在(!infle.eof())时尝试了,但该程序甚至没有使用此选项运行 这是我的ReadFile块: void ReadFile() {// Reads data file into array ifstream infile; infile.open(cTextF
,但该程序甚至没有使用此选项运行
这是我的ReadFile块:
void ReadFile() {// Reads data file into array
ifstream infile;
infile.open(cTextFileName);
if (!infile.good()) {
cout << "Cant find text data file!" << endl;
exit(1);
}
int i = 0;
int status;
//bool endOfFile = infile.eof();
infile >> gRecs[i].StudentNo;
while (infile) {
infile >> gRecs[i].FirstName;
infile >> gRecs[i].LastName;
infile >> gRecs[i].NumSubjects;
//cout << "ENTERED WHILE LOOP" << endl;
for (int j = 0; j < gRecs->NumSubjects; j++) {
infile >> gRecs[i].Subjects[j].Code;
infile >> status;
if (status == 0) {
gRecs[i].Subjects[j].Status == eEnrolled;
} else if (status == 1) {
gRecs[i].Subjects[j].Status == eProvisional;
} else {
gRecs[i].Subjects[j].Status == eWithdrawn;
}
infile >> gRecs[i].Subjects[j].Mark;
}
i++;
infile >> gRecs[i].StudentNo;
}
gNumRecs = i;
infile.close();
infile.clear();
cout << gNumRecs << " Records read!" << endl;
}
void ReadFile(){//将数据文件读入数组
河流充填;
infle.open(cTextFileName);
如果(!infle.good()){
高等教育学院[i].学生号;
while(填充){
infle>>gRecs[i].名字;
infle>>gRecs[i].姓氏;
infile>>gRecs[i].多学科;
//cout>gRecs[i].课题[j].代码;
填充>>状态;
如果(状态==0){
gRecs[i].受试者[j].状态==1;
}否则如果(状态==1){
gRecs[i].受试者[j].状态==预防性;
}否则{
gRecs[i].受试者[j].状态==EwithDrawed;
}
INFLE>>gRecs[i].受试者[j].马克;
}
i++;
INFLE>>gRecs[i].学生号;
}
gNumRecs=i;
infle.close();
infle.clear();
coutfor(int j=0;jNumSubjects;j++){
应该是
for (int j = 0; j < gRecs[i].NumSubjects; j++) {
for(int j=0;j
在我看来,解决这个问题的最好办法就是完全避免它
我将编写一个只读取一条记录的函数,而不是一个试图读取整个文件的函数。然后重复调用该函数,直到读取整个文件为止。为了适应标准库其余部分的工作方式,读取一条记录的函数应命名为operator>
接收对istream
的引用和对记录的引用,完成后返回对istream
的引用
std::istream &operator>>(std::istream &is, gRec &record) {
is >> record.FirstName;
is >> record.LastName;
is >> record.NumSubjects;
for (int i=0; i<record.NumSubjects; i++) {
is >> record.subjects[i].code;
int raw_status;
is >> raw_status;
record.subject[i].status = cvt_status(raw_status);
is >> record.mark;
}
return is;
}
那么一个记录应该是这样的:
class Record {
std::string FirstName, LastName;
Schedule classes;
public:
std::istream &operator>>(std::istream &is, Record &r) {
return is >> r.FirstName >> r.LastName >> r.classes;
}
};
std::ifstream infile("filename");
std::vector<Record> records{std::istream_iterator<Record>(infile), {}};
最后,阅读一个完整的学生记录文件是这样的:
class Record {
std::string FirstName, LastName;
Schedule classes;
public:
std::istream &operator>>(std::istream &is, Record &r) {
return is >> r.FirstName >> r.LastName >> r.classes;
}
};
std::ifstream infile("filename");
std::vector<Record> records{std::istream_iterator<Record>(infile), {}};
std::ifstream infle(“文件名”);
std::向量记录{std::istream_迭代器(infle),{};
您必须显示文件的格式。您的一个输入操作不正确,导致读取操作失败,从而导致循环失败。这是文本文件。调试代码时会发生什么情况?这并不能解决问题,但要养成用有意义的值初始化对象的习惯,而不是使用default初始化它们,然后赋值。也就是说,将ifstream infle;infle.open(whatever)
更改为ifstream infield(whatever);
。不需要调用infle.close()
;析构函数将执行此操作。最后,调用infle.clear()
关闭文件后,文件没有完成任何工作。这是可行的。但我不明白为什么索引需要在那里。我们只是在循环,直到主题数达到为止。前2条记录的循环工作正常,但之后没有。因此,如果没有索引,我很困惑,您实际上是在访问文件的第一个元素数组,这对于第一条记录是正确的,但对于以下记录则不正确。换句话说,gRecs->NumSubjects与gRecs[0]相同。NumSubjects,所以你在第一条记录上运气不错,但之后就错了。但是为什么第二条记录被正确存储?你必须向我们展示类定义才能弄清楚这一点。