簡體   English   中英

While循環無法讀取整個ifstream文件

[英]While loop not reading entire ifstream file

我的ReadFile函數無法讀取我的整個文件。 該文件包含幾行信息,每行信息都與一個學生有關。

函數(或while循環)正在讀取前兩個記錄,然后退出循環。 它可以正確讀取所有內容,但是為什么不繼續讀取整個文件(其中有13條記錄)呢?

我已經嘗試了while(!infile.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;
}
for (int j = 0; j < gRecs->NumSubjects; j++) {

應該

for (int j = 0; j < gRecs[i].NumSubjects; j++) {

我認為,解決此問題的最佳方法是完全避免它。

我將編寫一個僅讀取單個記錄的函數,而不是嘗試讀取整個文件的單個函數。 然后重復調用該函數,直到讀取了整個文件。 為了符合標准庫其余部分的工作方式,讀取單個記錄的功能應命名為operator>> 它應該收到一個istream引用和一個記錄引用,並在完成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;
}

就個人而言,我可能會從那里進行一些更改。 我將創建一個StatusSubjectSchedule ,每個定義一個自己的operator>>以便從文件中讀取自身:

class Status {
    enum class status { enrolled, provisional, withdrawn } s;

    friend std::istream &operator>>(std::istream &is, Status &s) { 
        int i;
        is >> i;
        switch (i) { 
            case 1: s.s = status::enrolled;    break;
            case 2: s.s = status::provisional; break;
            case 3: s.s = status::withdrawn;   break;
        }
        return is;
    }
};

class Subject {
    int code;
    Status status;
    int mark;
public:
    friend std::istream &operator>>(std::istream &is, Subject &s) { 
        return is >> s.code >> s.status >> s.mark;
    }
};

class Schedule {
    std::vector<Subject> classes;
public:
    friend std::istream &operator>>(std::istream &is) {
        int num;
        is >> num;
        for (int i=0; i<num; i++) {
            Subject temp;
            is >> temp;
            classes.push_back(temp);
       }
       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), {}};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM