2009-03-12 14 views
0

私はなぜ情報を失うのだろうかと思っていました。ベクトルに要素を追加する

これまで3つの機能があります。

オプション処理関数と、テキストファイルを読み込むためのものと、同じベクトルにユーザー指定を追加するものの2つのベクトル関数です。

私はファイルを読み込んでその内容をベクトルに保存し、次のオプションを選択して仕様を追加します。これを行うには、私はpush_backを使用します。私は出力(またはデバッグ)して、私が成功したかどうかを確認します。はい。だから私は、ファイルを再度読み取るオプションを選択し、私はどこに私は開始した。ユーザーの仕様が失われました。私はそのオプションを入力するたびにそれを割り当てているので、私はそれを考える。

私のコードはほとんどのプログラミング標準に準拠していません。

Heresカンマで区切られたfeildを分離し、構造体のvaraiblesに保存してから、ファイルの各行の要素としてベクターに保存した最初の関数です。

vector<sStruct> * loadFile(char *myTextFile) 
{ 
    myStruct 
     sStruct; 
    vector<myStruct> 
     vectorAddress, 
     *vectorData = new vector<myStruct> 
    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()) 
    { 

     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; 

    vectorData->push_back(sStruct); 

    } 

    inFile->clear(); 
    inFile->close(); 
    cout << vectorData->size(); 
    delete inFile; // allocated obj delete to fast why bother? 
    return vectorData; 
} 

この関数は、ベクトルに別の要素を追加するのに成功します。

vector<sStruct> * addElement(vector<sStruct> *vAddElement) 
{  
    sStruct addElement; // referring to the same struct. 
    cout << "Enter a String: "; 
    cin >> addElement.feild1 

    vAddElement->push_back(addElement); 
    cout << vAddElement->size() << endl; 
    return vAddElement; 
} 

最初の関数では、私はベクトルオブジェクトをデバッグし、ファイルからのデータを保存します。 OK。だから次の関数に行き、最初のfeildを持つ構造体メンバに文字列を追加します。うまくいけば何も上書きしないでください。私はデバッグするためにデバッグして、そのすべての良い、push_backはうまく動作します。しかし、私が最初の機能に行くとき。すべてが始まったときと同じように戻ってきます。

私はそのファイルを読んでいるので、私は知っていると私はその関数を入力するたびに割り当てる。これを防ぐ方法はありますか?

+0

あなたはたぶんベクトルの異なるインスタンスになりがちです。上記の関数を呼び出すコードは何ですか? – sharptooth

答えて

1

あなたの関数addElement()は、パラメータvAddElementを取得しますが、あなたはvectorData ...?!?にプッシュしていますか?

1

これは、loadFile()メソッドを入力するたびにベクトルの新しいインスタンスを作成するためです。ベクトルの内容を保持したい場合は、loadFile内にベクトルオブジェクトを作成しないでください。この関数の外で(おそらくloadFile()を呼び出す関数から)作成し、それをこの関数に渡します。

1
  1. loadFile()関数を変更して、vectorオブジェクトを参照してloadfile()で更新します。

このような何か:

bool loadFile(char *myTextFile, vector<sStruct>& vectorData_out) 
{ 
     //Read the file 
     //push_back the element into vectorData_out 
     //vectorData_out.push_back() ...code to push 
} 

2.Then参照によってvectorData_outを受け入れるためにはaddElementを変更:

std::vector<sStruct> aVectorData; 
loadFile("filename.txt", aVectorData); 
addElement(aVectorData); 

bool addElement(vector<sStruct>& vAddElement_out) 
{ 
     //initilization code for addElement 
    vAddElement_out.push_back(addElement); 
    cout << vAddElement->size() << endl; 
} 

今すぐあなたの呼び出し元のコードは、この行を探します

EDIT:また、絶対に必要でない限り、ヒープでの割り当てを避けるようにしてください。

0

ユーザーが指定したフィールドは、1行に複数行にまたがっていますか?

 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; 

上記のコードスニペットは4行で読み込みます。ユーザー入力ファイルの最初の数行を貼り付けることはできますか?