Загрузка данных в вектор структур - PullRequest
3 голосов
/ 24 февраля 2011

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

Полная программа приведена ниже:

Моя структура определена как

struct employee{
    string name;
    int id;
    double salary;
};

и текстовый файл (data.txt) содержит 11 записей в следующем формате:

Mike Tuff
1005 57889.9

, где "Mike Tuff" - это имя, "1005" - это идентификатор, а "57889.9" - это зарплата.

Я пытаюсь загрузить данные в вектор структур, используя следующий код:

#include "Employee.h" //employee structure defined in header file

using namespace std;

vector<employee>emps; //global vector 

// load data into a global vector of employees.
void loadData(string filename)
{
    int i = 0;
    ifstream fileIn;
    fileIn.open(filename.c_str());

    if( ! fileIn )  // if the bool value of fileIn is false
         cout << "The input file did not open.";

    while(fileIn)
    {
        fileIn >> emps[i].name >>emps[i].id >> emps[i].salary ;
        i++;
    }

    return;
}

Когда я выполняю это, я получаю сообщение об ошибке: «Отладочное утверждение не выполнено! Выражение: векторный индекс вне диапазона».

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011
std::istream & operator >> operator(std::istream & in, employee & e)
{
  return in >> e.name >> e.id >> e.salary; // double not make good monetary datatype.
}

int main()
{
  std::vector<employee> emp;
  std::copy(std::istream_iterator<employee>(std::cin), std::istream_iterator<employee>(), std::back_inserter(emp));
}
2 голосов
/ 25 февраля 2011

A vector расширяется, но только с помощью push_back(), resize() и некоторых других функций - если вы используете emps[i] и i больше или равно размеру vector ( который изначально равен 0), программа потерпит крах (если вам повезет) или выдаст странные результаты. Если вы заранее знаете желаемый размер, вы можете позвонить, например, по номеру. emps.resize(11) или объявить его как vector<employee> emps(11);. В противном случае вы должны создать временный employee в цикле, прочитать его и передать его emps.push_back().

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