Advertisement
baadgeorge

Untitled

Oct 16th, 2021
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.27 KB | None | 0 0
  1. // Реализация класса аэропорта для хранения
  2. // информации о рейсах в бинарном файле
  3. // Автор: Ляпин Г. А.
  4. // IP Lyapin GA & Co, 2019 - 2021
  5. // © All Rights Reserved.
  6.  
  7. #include <iostream>         // Потоковый ввод-вывод в строку
  8. #include <fstream>          // Потоковый ввод-вывод в файл
  9. #include <string>           // Строка (для хранения переменных)
  10. #include <vector>           // Вектор (массив)
  11. #include <unordered_map>    // Хэш-таблица
  12.  
  13. using namespace std;        // Для удобства
  14.  
  15. const int m = 100;          // Магическая константа для хэш-функции
  16.  
  17. // Класс с хэш-функцией
  18. // (передаем в unordered_map)
  19. class HashFunction {
  20. public:
  21.     // Эта перегрузка оператора необходима для unordered_map
  22.     int operator()(const int& FlightNumber) const
  23.     {
  24.         // По условию. Магическая константа выше
  25.         return FlightNumber / m;
  26.     }
  27. };
  28.  
  29. // Структура, реализующая хранение информации о рейсе
  30. // Number       - целое число, номер рейса
  31. // Destination  - строка, название пункта назначения рейса
  32. // AircraftType - строка, тип самолета
  33. struct Flight {
  34.  
  35.     int Number;             // Целое число, номер рейса
  36.     string Destination;     // Строка, название пункта назначения рейса
  37.     string AircraftType;    // Строка, тип самолета
  38.  
  39.     // Дефолтный конструктор без параметров
  40.     Flight() :
  41.         Number(0),
  42.         Destination(""),
  43.         AircraftType("")
  44.     {
  45.         //cout << "\tFlight Default Constructor\n";
  46.     }
  47.     // Конструктор с инициализацией по параметрам
  48.     Flight(const int& _Number, const string& _Destination, const string& _AircraftType) :
  49.         Number(_Number),
  50.         Destination(_Destination),
  51.         AircraftType(_AircraftType)
  52.     {
  53.         //cout << "\tFlight Parameter Constructor\n";
  54.     }
  55.     // Конструктор копирования
  56.     Flight(const Flight& other) :
  57.         Number(other.Number),
  58.         Destination(other.Destination),
  59.         AircraftType(other.AircraftType)
  60.     {
  61.         //cout << "\tFlight Copy Constructor\n";
  62.     }
  63.     // Деструктор
  64.     ~Flight()
  65.     {
  66.         //cout << "\tFlight Destructor\n";
  67.     }
  68.     // Оператор присваивания
  69.     Flight& operator=(const Flight& other)
  70.     {
  71.         Number = other.Number;
  72.         Destination = other.Destination;
  73.         AircraftType = other.AircraftType;
  74.  
  75.         return *this;
  76.     }
  77.  
  78. };
  79.  
  80. // Класс, реализующий аэропорт
  81. // FlightsInfo  - строка, содержит название бинарного файла, в котором хранится информация о рейсах
  82. // Hashtable    - хэш-таблица, из которой по ключу ищем номер записи с рейсом в бинарном файле
  83. class Airport {
  84. public:
  85.     // Дефолтный конструктор без параметров
  86.     Airport() :
  87.         FlightsInfo("info.bin")
  88.     {}
  89.     // Конструктор с инициализацией по параметрам
  90.     Airport(const string& file) :
  91.         FlightsInfo(file)
  92.     {}
  93.     // Деструктор
  94.     ~Airport()
  95.     {
  96.         // Очистка хэш-таблицы
  97.         HashTable.clear();
  98.     }
  99.     // Метод, реализующий запись рейса в конец бинарного файла
  100.     void PrintFlightToBinFile(const Flight& flight)
  101.     {
  102.         // Открытие бинарного файла с именем FlightsInfo в режиме добавления данных к уже имеющимся
  103.         ofstream output(FlightsInfo, ios::binary | ios_base::app);
  104.         // Запись в бинарный файл
  105.         output << flight.Number << '\n'
  106.             << flight.Destination << '\n'
  107.             << flight.AircraftType << '\n';
  108.     }
  109.     // Метод, реализующий чтение по номеру рейса соответствующей записи из бинарного файла
  110.     Flight GetFlightFromBinFile(const int& number)
  111.     {
  112.         int index;
  113.         //проверка на наличие ключа в хэш-таблице
  114.         if (HashTable.find(number) != HashTable.end()){
  115.             // Получаем номер записи из хэш-таблицы
  116.             index = HashTable[number];
  117.         }
  118.         else {
  119.             Flight* flight = new Flight(-1, "none", "none");
  120.             return *flight;
  121.         }
  122.        
  123.         // Открытие бинарного файла с именем FlightsInfo в режиме чтения
  124.         ifstream input(FlightsInfo, ios::binary);
  125.         // Пропуск записей до нужной
  126.         for (int i = 0; i < index; ++i) {
  127.             string tempString;
  128.             input >> tempString >> tempString >> tempString;
  129.         }
  130.  
  131.         // NUMBER 00 STR1SIZE 00 STR1 00 STR2SIZE 00 STR2 00 ...
  132.  
  133.         // Чтение информации о рейсе из бинарного файла
  134.         int _Number = 0;
  135.         string _Destination = "";
  136.         string _AircraftType = "";
  137.         input >> _Number >> _Destination >> _AircraftType;
  138.         // Выделение памяти в куче под новую запись
  139.         Flight* flight = new Flight(_Number, _Destination, _AircraftType);
  140.         return *flight;
  141.     }
  142.     // Оператор [] для удобства обращения за записью к аэропорту. По сути является оберткой
  143.     Flight operator[](int number) {
  144.         return GetFlightFromBinFile(number);
  145.     }
  146.     // Объявляем перегрузку оператора >> для ввода данных из текстового файла в аэропорт
  147.     // friend-ом. Необходимо для обращения к хэш-таблице
  148.     friend ifstream& operator>>(ifstream& stream, Airport& airport);
  149.  
  150. private:
  151.     // Хэш-таблица. Первый параметр - тип ключа (Key)
  152.     // Второй параметр - данные, хранящиеся в хэш-таблице (Value)
  153.     // HashTable - класс, реализующий хэш-функцию
  154.     unordered_map<int, int, HashFunction> HashTable;
  155.     string FlightsInfo;     // Строка, содержит название бинарного файла, в котором хранится информация о рейсах
  156. };
  157.  
  158. // Перегрузка оператора >> для ввода данных из текстового файла в аэропорт
  159. ifstream& operator>>(ifstream& stream, Airport& airport)
  160. {
  161.     // Вектор (массив) рейсов
  162.     vector<Flight> flights;
  163.  
  164.     // Инициализация переменных для чтения данных рейсов
  165.     int number = 0;
  166.     string destination = "";
  167.     string aircraftType = "";
  168.     // Чтение данных о рейсах из файлового потока
  169.     while (stream >> number
  170.         >> destination
  171.         >> aircraftType)
  172.     {
  173.         // Запись рейса в массив
  174.         flights.push_back(Flight(number, destination, aircraftType));
  175.     }
  176.  
  177.     // Для каждого рейса из массива
  178.     for (int i = 0; i < flights.size(); ++i) {
  179.         // Создание соответствующей записи в хэш-таблице
  180.         airport.HashTable[flights[i].Number] = i;
  181.         // Запись рейса в бинарный файл
  182.         airport.PrintFlightToBinFile(flights[i]);
  183.     }
  184.  
  185.     // Очистка массива с рейсами
  186.     flights.clear();
  187.  
  188.     return stream;
  189. }
  190.  
  191. // Точка входа в программу
  192. int main()
  193. {
  194.     // Файл с рейсами
  195.     ifstream input;
  196.     input.open("input.txt");
  197.  
  198.     // Удаление бинарного файла
  199.     remove("myAirport.bin");
  200.  
  201.     // Создание аэропорта с указанием имени бинарного файла для хранения данных
  202.     Airport myAirport("myAirport.bin");
  203.  
  204.     // Записываем данные о рейсах в аэропорт
  205.     input >> myAirport;
  206.  
  207.     // Пример получения записи
  208.     Flight myFlight = myAirport[10];//or Flight myFlight = myAirport.GetFlightFromBinFile(...);
  209.  
  210.  
  211.     // Вывод записи в консоль
  212.     cout << myFlight.Number << " ------ "
  213.         << myFlight.Destination << " ------ "
  214.         << myFlight.AircraftType << "\n";
  215.  
  216.     return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement