Vector不会推回getline()

时间:2017-07-11 04:35:07

标签: c++ vector g++ ifstream push-back

所以这是我遇到push_back问题的函数:

void School::PushBackS(ifstream &in) {
    string a, b, c, d;
    while(getline(in, a)) {
        getline(in, b);
        getline(in, c);
        getline(in, d);
        t.SetStudentID(a);
        t.SetName(b);
        t.SetAddress(c);
        t.SetPhone(d);
        students.push_back(Student(a, b, c, d));
        cout << t.ToStringS();
    }
}

这是主要的实现(我不认为这里有问题,但以防万一):

ifstream in;
School s;
in.open(argv[1]);
if(in.is_open()) {
    s.PushBackS(in);
}
in.close();

我尝试过推回Object t,并推回新的Student(),但都没有工作。

它旨在从文件读入并将其推回到对象中。一切都很完美,但它并没有推向学生的向量。

如果这很重要:函数PushBackS()在一个类中,它调用一个具有ToStringS()和Set函数的单独类,类和main之间似乎没有任何通信问题,因为它打印出ToString没有问题。唯一的问题似乎与push_back本身有关。

感谢您的帮助。抱歉,我的格式有点奇怪。

更新:所以发生了一件非常奇怪的事情。输入这个函数会清除我的前两个向量,然后单独留下第三个向量。

void School::CalcGPA(vector<Grade> &myVector, vector<double> &gpa, vector<string> names) {
//opening this function clears my Student and Grade vectors, Query vector remains populated
    Grade temporary;
    for(size_t i; i < query.size(); i++) {
        myVector.clear();
        for(size_t j; j < grade.size(); j++) { //segmentation fault on this line
            if(query[i].GetNum() == grade[j].GetNumber()) {
                cout << grade[j].ToStringG();
                temporary.GetGrade();
                myVector.push_back(temporary);
            }
            if (myVector.size() != 0) {
                for(size_t k = 0; k < myVector.size(); k++){
                    temporary = myVector[k];
                    temporary.GPA(gpa[i]);
                }
                gpa[i] = gpa[i]/myVector.size();
            }
            else {
                gpa[i] = 0.0;
            }
        }
        if(query.size() == gpa.size() == names.size()) {
            cout << query[i].ToStringQ() << "\t" << gpa[i] << "\t" << names[i] << endl;
        }
        else {
            cout << "error, vector sizes do not match" << endl;
        }
    }
}

有谁知道发生了什么?我知道在打开这个函数之前,我的所有向量都是完全填充的,而且之后,它们不是。我以前从来没有这样的事情。我正在使用g ++进行编译,如果这可能是问题。

1 个答案:

答案 0 :(得分:0)

我怀疑gpa数组的大小不正确且语句

gpa[i] = 0.0;

导致内存损坏。

您应该使用at()函数而不是[]运算符,因为它执行边界检查。 vector<string>论证也是可疑的;它应该是const vector<string>&,因此不会复制。