Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ While循环不读取整个ifstream文件_C++_Fileinputstream - Fatal编程技术网

C++ While循环不读取整个ifstream文件

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函数没有读取我的整个文件。该文件包含与一名学生相关的信息行

函数(或者while循环)正在读取前两条记录,然后退出循环。它正在正确读取所有内容,但为什么不继续读取整个文件(其中有13条记录)

我在(!infle.eof())时尝试了
,但该程序甚至没有使用此选项运行

这是我的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();
cout
for(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,所以你在第一条记录上运气不错,但之后就错了。但是为什么第二条记录被正确存储?你必须向我们展示类定义才能弄清楚这一点。