Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Реализация класса аэропорта для хранения
- // информации о рейсах в бинарном файле
- // Автор: Ляпин Г. А.
- // IP Lyapin GA & Co, 2019 - 2021
- // © All Rights Reserved.
- #include <iostream> // Потоковый ввод-вывод в строку
- #include <fstream> // Потоковый ввод-вывод в файл
- #include <string> // Строка (для хранения переменных)
- #include <vector> // Вектор (массив)
- #include <unordered_map> // Хэш-таблица
- using namespace std; // Для удобства
- const int m = 100; // Магическая константа для хэш-функции
- // Класс с хэш-функцией
- // (передаем в unordered_map)
- class HashFunction {
- public:
- // Эта перегрузка оператора необходима для unordered_map
- int operator()(const int& FlightNumber) const
- {
- // По условию. Магическая константа выше
- return FlightNumber / m;
- }
- };
- // Структура, реализующая хранение информации о рейсе
- // Number - целое число, номер рейса
- // Destination - строка, название пункта назначения рейса
- // AircraftType - строка, тип самолета
- struct Flight {
- int Number; // Целое число, номер рейса
- string Destination; // Строка, название пункта назначения рейса
- string AircraftType; // Строка, тип самолета
- // Дефолтный конструктор без параметров
- Flight() :
- Number(0),
- Destination(""),
- AircraftType("")
- {
- //cout << "\tFlight Default Constructor\n";
- }
- // Конструктор с инициализацией по параметрам
- Flight(const int& _Number, const string& _Destination, const string& _AircraftType) :
- Number(_Number),
- Destination(_Destination),
- AircraftType(_AircraftType)
- {
- //cout << "\tFlight Parameter Constructor\n";
- }
- // Конструктор копирования
- Flight(const Flight& other) :
- Number(other.Number),
- Destination(other.Destination),
- AircraftType(other.AircraftType)
- {
- //cout << "\tFlight Copy Constructor\n";
- }
- // Деструктор
- ~Flight()
- {
- //cout << "\tFlight Destructor\n";
- }
- // Оператор присваивания
- Flight& operator=(const Flight& other)
- {
- Number = other.Number;
- Destination = other.Destination;
- AircraftType = other.AircraftType;
- return *this;
- }
- };
- // Класс, реализующий аэропорт
- // FlightsInfo - строка, содержит название бинарного файла, в котором хранится информация о рейсах
- // Hashtable - хэш-таблица, из которой по ключу ищем номер записи с рейсом в бинарном файле
- class Airport {
- public:
- // Дефолтный конструктор без параметров
- Airport() :
- FlightsInfo("info.bin")
- {}
- // Конструктор с инициализацией по параметрам
- Airport(const string& file) :
- FlightsInfo(file)
- {}
- // Деструктор
- ~Airport()
- {
- // Очистка хэш-таблицы
- HashTable.clear();
- }
- // Метод, реализующий запись рейса в конец бинарного файла
- void PrintFlightToBinFile(const Flight& flight)
- {
- // Открытие бинарного файла с именем FlightsInfo в режиме добавления данных к уже имеющимся
- ofstream output(FlightsInfo, ios::binary | ios_base::app);
- // Запись в бинарный файл
- output << flight.Number << '\n'
- << flight.Destination << '\n'
- << flight.AircraftType << '\n';
- }
- // Метод, реализующий чтение по номеру рейса соответствующей записи из бинарного файла
- Flight GetFlightFromBinFile(const int& number)
- {
- int index;
- //проверка на наличие ключа в хэш-таблице
- if (HashTable.find(number) != HashTable.end()){
- // Получаем номер записи из хэш-таблицы
- index = HashTable[number];
- }
- else {
- Flight* flight = new Flight(-1, "none", "none");
- return *flight;
- }
- // Открытие бинарного файла с именем FlightsInfo в режиме чтения
- ifstream input(FlightsInfo, ios::binary);
- // Пропуск записей до нужной
- for (int i = 0; i < index; ++i) {
- string tempString;
- input >> tempString >> tempString >> tempString;
- }
- // NUMBER 00 STR1SIZE 00 STR1 00 STR2SIZE 00 STR2 00 ...
- // Чтение информации о рейсе из бинарного файла
- int _Number = 0;
- string _Destination = "";
- string _AircraftType = "";
- input >> _Number >> _Destination >> _AircraftType;
- // Выделение памяти в куче под новую запись
- Flight* flight = new Flight(_Number, _Destination, _AircraftType);
- return *flight;
- }
- // Оператор [] для удобства обращения за записью к аэропорту. По сути является оберткой
- Flight operator[](int number) {
- return GetFlightFromBinFile(number);
- }
- // Объявляем перегрузку оператора >> для ввода данных из текстового файла в аэропорт
- // friend-ом. Необходимо для обращения к хэш-таблице
- friend ifstream& operator>>(ifstream& stream, Airport& airport);
- private:
- // Хэш-таблица. Первый параметр - тип ключа (Key)
- // Второй параметр - данные, хранящиеся в хэш-таблице (Value)
- // HashTable - класс, реализующий хэш-функцию
- unordered_map<int, int, HashFunction> HashTable;
- string FlightsInfo; // Строка, содержит название бинарного файла, в котором хранится информация о рейсах
- };
- // Перегрузка оператора >> для ввода данных из текстового файла в аэропорт
- ifstream& operator>>(ifstream& stream, Airport& airport)
- {
- // Вектор (массив) рейсов
- vector<Flight> flights;
- // Инициализация переменных для чтения данных рейсов
- int number = 0;
- string destination = "";
- string aircraftType = "";
- // Чтение данных о рейсах из файлового потока
- while (stream >> number
- >> destination
- >> aircraftType)
- {
- // Запись рейса в массив
- flights.push_back(Flight(number, destination, aircraftType));
- }
- // Для каждого рейса из массива
- for (int i = 0; i < flights.size(); ++i) {
- // Создание соответствующей записи в хэш-таблице
- airport.HashTable[flights[i].Number] = i;
- // Запись рейса в бинарный файл
- airport.PrintFlightToBinFile(flights[i]);
- }
- // Очистка массива с рейсами
- flights.clear();
- return stream;
- }
- // Точка входа в программу
- int main()
- {
- // Файл с рейсами
- ifstream input;
- input.open("input.txt");
- // Удаление бинарного файла
- remove("myAirport.bin");
- // Создание аэропорта с указанием имени бинарного файла для хранения данных
- Airport myAirport("myAirport.bin");
- // Записываем данные о рейсах в аэропорт
- input >> myAirport;
- // Пример получения записи
- Flight myFlight = myAirport[10];//or Flight myFlight = myAirport.GetFlightFromBinFile(...);
- // Вывод записи в консоль
- cout << myFlight.Number << " ------ "
- << myFlight.Destination << " ------ "
- << myFlight.AircraftType << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement