Добавление элемента в вектор - PullRequest
0 голосов
/ 12 марта 2009

Мне было интересно, почему я теряю информацию.

Пока у меня три функции.

Функция обработки опций и две векторные функции, одна для чтения текстового файла, а другая для добавления пользовательской спецификации к тому же вектору.

Что происходит, я читаю файл и сохраняю его содержимое в векторе, а затем выбираю следующую опцию, чтобы добавить спецификацию. Для этого я использую push_back. Я вывод (или отладка), чтобы увидеть, если я был успешным. да. Поэтому я выбираю опцию, которая снова читает файл, и я возвращаюсь к тому, с чего начал. Спецификация пользователей была потеряна. И я думаю, это потому, что я распределяю его каждый раз, когда вхожу в эту опцию.

Я новичок, поэтому мой код не соответствует большинству стандартов программирования.

Вот моя первая функция, которая изолирует поля, разделенные запятыми, сохраняется в переменных-членах структуры, а затем сохраняется в векторе как элементы для каждой строки в файле.

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

Когда я в первой функции, я отлаживаю свой векторный объект, и данные из файла сохраняются. Хорошо. Поэтому я перехожу к следующей функции и добавляю строку к члену структуры, который имеет первое поле. Надеюсь, ничего не перезаписать. Я отлаживаю, чтобы убедиться и нет, все хорошо, push_back работает хорошо. Но когда я иду к своей первой функции. Все возвращается, как это было, когда начинается.

Я знаю это, потому что я читаю файл и распределяю каждый раз, когда вхожу в эту функцию. Есть ли способ предотвратить это?

Ответы [ 4 ]

1 голос
/ 12 марта 2009

Это потому, что вы создаете новый экземпляр вектора каждый раз, когда вводите метод loadFile (). Если вы хотите сохранить содержимое вектора, не создавайте векторный объект внутри loadFile. Создайте его вне этой функции (возможно, из той, которая вызывает loadFile ()) и передайте ее этой функции.

1 голос
/ 12 марта 2009
  1. Внесите изменения в функцию loadFile (), чтобы взять векторный объект по ссылке и обновить его в 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. Затем измените addElement, чтобы принимать vectorData_out по ссылке:

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

Теперь ваш код вызова выглядит следующим образом:

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

РЕДАКТИРОВАТЬ : Кроме того, старайтесь избегать выделения в куче, если это не является абсолютно необходимым

1 голос
/ 12 марта 2009

Ваша функция addElement () получает параметр vAddElement, но вы нажимаете в vectorData ...?!?

0 голосов
/ 12 марта 2009

Являются ли указанные пользователем поля одной строкой или распределены по нескольким строкам?

     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;

Приведенный выше фрагмент кода читается в четыре строки. Можете ли вы вставить первые несколько строк вашего пользовательского файла ввода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...