Как сохранить данные из файла в вектор структур с элементами вектора - PullRequest
0 голосов
/ 29 ноября 2018

Допустим, входной файл содержит следующее, каждое из которых соответствует четырем элементам в структуре:
0 2 54 34

1 2 43 56

4 5 32 67

Так, например, в первой строке входного файла я бы хотел, чтобы 0 был сохранен в качестве escapeStationId, 2 был бы сохранен в качестве ArrivalStationId, 54 был бы сохранен в качестве flightTime, а 34 - в качестве ArrivalTime.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <list>
#include <vector>
#include <utility>
#include "graph.h"
using namespace std;


int main(int argc, char **argv)
{

  ifstream file;


  struct TrainsFile{ 
    vector<int> departureStationId;
    vector<int> arrivalStationId;
    vector<int> departureTime;
    vector<int> arrivalTime;
  };


  vector<TrainsFile> trains;//creating vector of structs here


  file.open(argv[1]);

  if (file.is_open())
 {
   //How does one use push_back() here given that I am dealing with vectors within vectors?
   while(!file.eof())
   {
    file >> departureStationId >> arrivalStationId >> departureTime >> 
    arrivalTime;
   }

 }
}

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Исходя из ваших заявленных целей и примера файла данных, я думаю, вы движетесь в неверном направлении.Похоже, вам нужен список поездов в файле, а не список файлов поездов.Это заставит vector s внутри TrainsFile уйти и устранить вашу проблему.

С быстрым переименованием структуры мы получим

struct Train
{
    int departureStationId;
    int arrivalStationId;
    int departureTime;
    int arrivalTime;
};

, и если мы переместим чтениефайла от

while(!file.eof())
{
    file >> departureStationId >> arrivalStationId >> departureTime >> arrivalTime;
}

до operator>> перегрузки для чистоты

std::istream &operator >>(std::istream & in, Train & train)
{
    return in >> train.departureStationId 
              >> train.arrivalStationId 
              >> train.departureTime 
              >> train.arrivalTime;
}

мы можем затем переписать неисправный цикл while в

Train train;
while (file >> train)
{
    trains.push_back(train);
}

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

Полностью собранный пример:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

struct Train
{
    int departureStationId;
    int arrivalStationId;
    int departureTime;
    int arrivalTime;
};

std::istream &operator >>(std::istream & in, Train & train)
{
    return in >> train.departureStationId
              >> train.arrivalStationId
              >> train.departureTime
              >> train.arrivalTime;
}

int main(int argc, char **argv)
{

    ifstream file;

    vector<Train> trains; //creating vector of structs here

    // strongly recommend testing argc to make sure there ID an argv[1] here
    file.open(argv[1]);

    if (file.is_open())
    {
        Train train;
        while (file >> train)
        {
            trains.push_back(train);
        }
    }
}

Поскольку, как представляется, по одному поезду на линию, улучшение будет для использования std::getline для извлечения строкииз файла, а затем используйте std::istringstream, чтобы извлечь поезд из линии.Это позволит вам лучше обнаруживать и восстанавливать поврежденный файл.Смотрите Считайте файл построчно, используя ifstream в C ++ , чтобы продемонстрировать этот подход.

0 голосов
/ 30 ноября 2018

Создать новые переменные (для чтения)

int departureId, arrivalId, departureT, arrivalT;

Внутри вашего цикла:

while(file >> departureId >> arrivalId>> departureT >> arrivalT)
{
        TrainsFile trainsfile;
        trainsfile.departureStationId.push_back(departureId);
        trainsfile.arrivalStationId.push_back(arrivalId);
        trainsfile.departureTime.push_back(departureT);
        trainsfile.arrivalTime.push_back(arrivalT);
        trains.push_back(trainsfile);
}//other code

Просто нужно, чтобы эти переменные поместили нужный объект, а затем подтолкнули ваш главный вектор

...