【问题标题】:Vector won't pushback getline()Vector 不会推回 getline()
【发布时间】: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


【解决方案1】:

我怀疑gpa 数组的大小不合适,语句

gpa[i] = 0.0;

导致内存损坏。

您应该使用at() 函数而不是[] 运算符,因为它执行边界检查。 vector&lt;string&gt; 的说法也很可疑;应该是const vector&lt;string&gt;&amp;,这样就不会复制了。

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 1970-01-01
    • 2020-11-12
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多