Сохранение 4 значений из каждой строки из текстового файла в объект - C ++ - PullRequest
0 голосов
/ 07 мая 2019

Я хочу взять 4 значения, каждое через запятую, и сохранить их в объекте аэропорта.Каждая строка будет иметь эти 4 значения будут храниться вместе.Таким образом, при вызове всех объектов из Швеции будут найдены все объекты из страны Швеции, а также найдены соответствующие значения.Прямо сейчас у меня есть 4 различных вектора, которые хранят все 4 значения объекта, однако, не обязательно устанавливать все 4 атрибута / значения вместе как объект.Помощь очень ценится.

Примеры того, как выглядит текстовый файл -

1, Горока, Горока, Папуа-Новая Гвинея, GKA, AYGA, -6.081689,145.391881,5282,10, U 2, Маданг, МадангПапуа-Новая Гвинея, MAG, AYMD, -5,207083,145,7887,20,10, U


#include "pch.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iterator>
#include <algorithm>
using namespace std;

struct Airport
{
string code;
string name;
string city;
string nation;

friend std::istream& operator>>(std::istream& input, Airport& a);
};

istream& operator>>(std::istream& input, Airport& a)
 {
getline(input, a.code, ',');
getline(input, a.name, ',');
getline(input, a.city, ',');
getline(input, a.nation);
return input;
}
////////////////////////////////////////////

vector<string> split(const string& s, const string& delim)
 {
const bool keep_empty = true;
vector<string> result;

if (delim.empty())
{
    result.push_back(s);
    return result;
}

string::const_iterator substart = s.begin(), subend;

while (true)
{
    subend = search(substart, s.end(), delim.begin(), delim.end());
    string temp(substart, subend);
    if (keep_empty || !temp.empty())
    {
        result.push_back(temp);
    }
    if (subend == s.end())
    {
        break;
    }
    substart = subend + delim.size();
}

return result;
}

// Sorting Function 
bool Sort_By_Name_Ascending(const Airport& a, const Airport& b)
{
return a.name < b.name;
}


int main()
{
vector<Airport> database;
Airport a;

char choice;
string chr;

ifstream inputFile;
inputFile.open("airports.dat");

if (!inputFile)
{
    cout << "File Access Error!";
    return 0;
}

string fileLine;
cout << "Reading File ..." << endl;

while (!inputFile.eof())
{
    getline(inputFile, fileLine);
    vector<string> lineVector = split(fileLine, ",");
    if (lineVector[4].length() == 3)
    {
        while (inputFile >> a)
        {
            database.push_back(a);
        }
    }

}

cout << "What would you like to do?\nA. Sort in Alphabetical Order.\nB. 
Delete an Airport.\nC. Exit Program." << endl;

cin >> choice;

switch (choice)
{
case 'A':
    sort(database.begin(), database.end(), Sort_By_Name_Ascending);
break;

case 'B':
    cout << "Deleting a value" << endl;

break;

case 'C':
return 0;
break;
}


return 0;
}

1 Ответ

2 голосов
/ 07 мая 2019

Вы можете организовать свои структуры данных в модель входные данные:

struct Airport
{
  std::string    code;
  std::string    name;
  std::string    city;
  std::string    nation;
};

Следующим шагом является перегрузка operator>> для чтения в экземпляре из потока:

struct Airport
{
  //...
  friend std::istream& operator>>(std::istream& input, Airport& a);
};
std::istream& operator>>(std::istream& input, Airport& a)
{
    std::getline(input, a.code, ',');
    std::getline(input, a.name, ',');
    std::getline(input, a.city, ',');
    std::getline(input, a.nation);
    return input;
}

Это упрощает ввод:

std::vector<Airport> database;
Airport a;
while (inputfile >> a)
{
  database.push_back(a);
}

Для сортировки можно придумать некоторые функции или функциональные объекты и передать их в std::sort:

bool Sort_By_Name_Ascending(const Airport& a, const Airport& b)
{
  return a.name < b.name;
}

//...
std::sort(database.begin(), database.end(), Sort_By_Name_Ascending);

Редактировать 1: вся запись или строка
Существует разница между моделированием строки целом и только интересующими вас полями. Если ваши записи представляют собой текстовую строку (одна запись == одна текстовая строка), вы можете прочитать в текстовой строке как затем извлеките интересующие вас поля.

std::istream& operator>>(std::istream& input, Airport& a)
{
    std::string record;
    std::getline(input, record);

    // Now extract the interesting fields from the string.
    std::istringstream record_stream;
    unsigned int record_number;
    char         comma;
    record_stream >> record_number;  // Read but ignore.
    record_stream >> comma;          // Read but ignore.
    std::getline(record_stream, a.code, ',');
    std::getline(record_stream, a.name, ',');
    std::getline(record_stream, a.city, ',');
    std::getline(record_stream, a.nation);
    return input;    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...