Исходя из ваших заявленных целей и примера файла данных, я думаю, вы движетесь в неверном направлении.Похоже, вам нужен список поездов в файле, а не список файлов поездов.Это заставит 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 ++ , чтобы продемонстрировать этот подход.