2017-07-11 7 views
-2

So, hier ist die Funktion, die ich push_back Probleme habe mit:Vektor wird nicht Pushback getline()

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(); 
    } 
} 

Hier ist die Haupt-Implementierung (Ich glaube nicht, dass es hier ein Problem, aber nur in Fall):

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

Ich habe versucht, Objekt t zurückzudrängen und neue Student() als auch Push und nicht funktionieren.

Es ist beabsichtigt, aus einer Datei einzulesen und sie zurück in ein Objekt zu schieben. Alles funktioniert perfekt, aber es drängt sich nicht in den Schülervektor zurück.

Falls dies wichtig ist: Die Funktion PushBackS() gehört zu einer Klasse, die eine separate Klasse aufruft, die die ToStringS() - und Set-Funktionen hat. Es scheint keine Kommunikationsprobleme zwischen Klassen und Hauptteilen zu geben Es druckt den ToString ohne Probleme aus. Das einzige Problem scheint mit dem Push_back selbst zu sein.

Danke für Ihre Hilfe. Entschuldigung, meine Formatierung ist ein bisschen komisch.

Update: So passiert wirklich eine seltsame Sache. Die Eingabe dieser Funktion löscht meine ersten beiden Vektoren und lässt die dritte allein.

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; 
     } 
    } 
} 

Hat jemand eine Idee, was passiert? Ich weiß, dass kurz bevor diese Funktion geöffnet wird, alle meine Vektoren vollständig ausgefüllt sind, und direkt danach sind sie es nicht. Ich habe noch nie so etwas erlebt. Ich verwende g ++, um zu kompilieren, wenn das das Problem sein könnte.

+0

Was lässt Sie denken, dass 'push_back' nicht funktioniert? Was ist die Eingabe? Was ist die erwartete Ausgabe? Was ist die tatsächliche Ausgabe? –

+0

Eingabe ist eine Textdatei, es gibt zwei erwartete Ausgaben: erstens sollte der Cout jedes Objekt in der von mir gewünschten Formatierung ausdrucken, das funktioniert super; zweitens sollten die Objekte zurück in meinen Studentenvektor geschoben werden, aber wenn ich die Vektorgröße überprüfe, kommt sie auf null, und wenn ich versuche, direkt aus dem Vektor zu drucken, kommt nichts heraus. – tydcghk

+0

Das klingt alles gut. Bitte poste ein [mcve]. Ohne das ist es schwer herauszufinden, wo das Problem liegen könnte. –

Antwort

0

Ich vermute, dass die gpa Array nicht richtig bemessen ist und die Aussage

gpa[i] = 0.0; 

Speicherfehler verursacht.

Sie sollten die at()-Funktion anstelle des []-Operators verwenden, da sie die Überprüfung von Grenzen durchführt. Das Argument vector<string> ist ebenfalls verdächtig; es sollte wohl const vector<string>& sein, damit keine Kopie gemacht wird.