2009-03-12 12 views
-2

Ich habe eine sehr trival Option Verarbeitungsfunktion, und ich muss diese Funktion so oft eingeben. Also kann ich den Vektor nicht zuordnen. Ich muss in der Lage sein, ein Element zum Vektor hinzuzufügen und es zu speichern, also wenn ich zu dieser Funktion zurückkomme, ist es immer noch ihr.Halten Sie Informationen in Vektor von Func zu Func

vector<sStruct> * loadFile(char *myTextFile) 
{ 
    myStruct 
     sStruct; 
    vector<myStruct> 
     vectorAddress, 
     vectorData; 
vectorData = &vectorAddress; 
    string 
     feild1, feild2, feild3, feild4; 

    ifstream 
     *inFile = new ifstream; 

    inFile->open(myTextFile, ios::in); 


    if (!inFile->good()) 
    { 
     cout << "? File Doesnt Exist! " << endl; 
    } 

    while (!inFile->eof()) 
    { 

// reading a file deliimted by commas hi,hello,hey,1234 
//... 
     getline(*inFile, feild1, ','); 
     sStruct.m_1 = field1; 
     getline(*inFile, feild2, ','); 
     sStruct.m_2 = field2; 
     getline(*inFile, field3, ','); 
     sStruct.m_3; = feild3 
     getline(*inFile, feild4); 
     sStruct.m_4 = feield4; 

// saving each member of the struct in the vector 
    vectorAddress.push_back(sStruct); 

    } 

    inFile->clear(); 
    inFile->close(); 

    cout << vectorAddress.size() << endl; 
    delete inFile; 
// 
    (*vectorData) = vectorAddress; 
    return vectorData; 
} 

// This function tries despretly to add another element saved in struct member varaible 
// to the end of the vector. I need the information from the first function to be here. What i think im trying to do is refer to the same address in memory. 


vector<sStruct> * addElement(vector<sStruct> *vAddElement) 
{  
    myStruct sAddElement; // referring to the same struct. 
    vector<sStruct> vectorAddress; 
    vAddElement = &vectorAddress; 

    cout << "Enter a String: "; 
    cin >> sAddElement.feild1 // save user spec in struct member 

    vectorAddress.push_back(sAddElement); 
    cout << vectorAddress.size() << endl; 
    (*vAddElement) = vectorAddress; 
    return vAddElement; 
} 

Und ich versuche, dies zu tun, ohne die Funktion signuatures zu ändern.

Antwort

3

Als Erstes verwenden Sie Referenzen für diese Art von Sache, es reduziert unnötigen Code und kann nicht NULL sein.

auf die Frage, zu einem Vektor hinzufügen, push_back oder eine andere Methode verwenden, die auf einen Vektor, fügt hinzu, ist das, was Sie getan haben, versuchen, den Vektor zuzuordnen:

vector<sStruct> *addElement(vector<sStruct> &vAddElement) { 
    myStruct sAddElement; // referring to the same struct. 

    cout << "Enter a String: "; 
    cin >> sAddElement.feild1 // save user spec in struct member 

    vAddElement.push_back(sAddElement); 
    cout << vectorAddress.size() << endl; 

    return &vAddElement; // since you said you must return a pointer (which is silly) 
         // we'll return the address of the object passed in. 
} 

EDIT: Warum benutzen Sie Zeiger so sehr (überhaupt), dass es in Ihrem Programm absolut keine Notwendigkeit für irgendeine Art von dynamischer Zuteilung gibt oder die Adresse von Mitgliedern nimmt. Die übliche Stapelzuweisung und die Übergabe per Referenz würden es Ihnen ermöglichen, die gleiche Arbeit mit der Hälfte des Codes (und korrekt) zu erledigen.

EDIT: Auch Ihre Schleife gebrochen ist, können Sie nicht richtig für EOF testen, bis nach Sie lesen versucht. Es ist einfacher, wie etwas zu tun:

while(getline(file, line)) { /* process line */ } 

EDIT:

auch dieser Code von Ihnen ist nicht einmal in der Nähe zu dem, was Sie denken, es tut, Ich werde recomment es für Sie so weiß:

vector<sStruct> *addElement(vector<sStruct> *vAddElement) {  
    myStruct sAddElement; 

    // ... 

    vector<sStruct> vectorAddress; // creates a new *vector* on the stack 
    vAddElement = &vectorAddress; // makes vAddElement point to the new vector 
            // but does *not* effect the vector whose 
            // address you passed 

    // ... 

    vectorAddress.push_back(sAddElement); // adds an element to the new vector 
    cout << vectorAddress.size() << endl; // it's size will always be 1, 
              // since you just added the first element 

    (*vAddElement) = vectorAddress; // does absolutely nothing, you are assigning 
            // the new vector to itself 

    return vAddElement; // erroneously returns a pointer to the new vector 
          // it was allocated on the stack and no longer exists 
          // after the return, **never do that ** 
} 
+0

+1 hätte ich gesagt, aber ich konnte nicht recht ergründen, ob das war was gefragt wurde oder nicht. –

+0

Ich muss Zeiger für die Rückgabetypen verwenden .. – user40120

+0

Nun tut mir leid, das zu hören, also was Sie tun sollten es einfach "return & vAddElement;" Da die Adresse einer Referenz gleich der Adresse ist, auf die sie sich bezieht. –