【发布时间】:2017-07-11 04:35:06
【问题描述】:
这是我遇到 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,也推回 new Student(),但都不管用。
它旨在从文件中读取并将其推回对象中。一切正常,但它不会 push_back 进入学生向量。
如果这很重要:函数 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++ 进行编译。
【问题讨论】:
-
是什么让您认为
push_back不起作用?输入是什么?预期的输出是多少?实际输出是多少? -
输入是一个文本文件,有两个预期的输出:首先,cout 应该以我想要的格式打印出每个对象,这很好用;其次,对象应该推回到我的学生向量中,但是当我检查向量大小时,它出现为零,当我尝试直接从向量中打印时,什么也没有出现。
-
听起来不错。请发布minimal reproducible example。没有它,就很难找出问题出在哪里。
-
我不确定这些是什么意思.. 但我查了一下,我认为它很肤浅?我的构造函数设置为: this->string = string;这告诉你了吗?
-
好的,所以我尝试做最小、完整和可验证的示例,但它正在推后,只是稍后失去它们,我完全不知道如何。我将使用丢失数据的代码进行更新。
标签: c++ vector g++ ifstream push-back