From 5c2ecf0d448a8dd35212242c02d0399510c6bd77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=A1=D0=B0=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Sat, 9 Jan 2021 12:44:05 +0000 Subject: [PATCH] Upload New File --- WorkWithFile.h | 161 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 WorkWithFile.h diff --git a/WorkWithFile.h b/WorkWithFile.h new file mode 100644 index 0000000..b4b3131 --- /dev/null +++ b/WorkWithFile.h @@ -0,0 +1,161 @@ +// +// Created by Egor Salkov on 17.12.2020. +// + +//#ifndef SEM3_DZ1_WORKWITHFILE_H +//#define SEM3_DZ1_WORKWITHFILE_H +// +//#endif //SEM3_DZ1_WORKWITHFILE_H +#include +#include +#include "Apteka.h" +#include +#include +#include +#include +#include + +class file_work { + string file_name; +public: + void add_record(const string &file_name, const Apteka_st &p_rec) { + std::ofstream file(file_name, std::ios::app | std::ios::binary); + if (file.is_open()) { + file.write((char *) &p_rec, sizeof(p_rec)); + } else cout << "File not open"; + file.close(); + } + + file_work(const string name) : file_name(name) {} + + template + vector search_element(Element element) { + + vector res; + std::ofstream fileTMP("Find_Result", std::ios::out | std::ios_base::binary); + std::ifstream file(file_name, std::ios_base::binary); + if (!file.is_open()) + return res; + Apteka_st apteka; + + while (file.read((char *) &apteka, sizeof(apteka))) { + if (element(apteka)) + res.push_back(apteka); + } + + for (auto &a : res) { + fileTMP.write((char *) &a, sizeof(a)); + } + file.close(); + fileTMP.close(); + remove("file_name"); + rename("TMP", "file_name"); + + return res; + } + + + void change_record(const string &file_name, const int number, const string &name, const string &data, + const Apteka_st &p_rec = Apteka_st()) { + std::ofstream fileTMP("TMP", std::ios::out | std::ios_base::binary); + std::ifstream file(file_name, std::ios_base::binary); + if (file.is_open()) { + Apteka_st apteka; + while (!file.eof()) { + file.read((char *) &apteka, sizeof(apteka)); + if (apteka.number != number || apteka.name != name || apteka.data != data) + fileTMP.write((char *) &apteka, sizeof(apteka)); + else + fileTMP.write((char *) &p_rec, sizeof(p_rec)); + } + remove("file_name"); + rename("TMP", "file_name"); + } else std::cout << "File not found" << std::endl; + file.close(); + fileTMP.close(); + } + + void delete_record(const int number, const string &name, const string &data) { + std::ofstream fileTMP("TMP", std::ios::out | std::ios_base::binary); + std::ifstream file(file_name, std::ios_base::binary); + if (file.is_open()) { + Apteka_st apteka; + while (file.read((char *) &apteka, sizeof(apteka))) { + if (apteka.number != number || apteka.name != name || apteka.data != data) + fileTMP.write((char *) &apteka, sizeof(apteka)); + } + file.close(); + fileTMP.close(); + remove("file_name"); + rename("TMP", "file_name"); + } else std::cout << "File not found" << std::endl; + file.close(); + fileTMP.close(); + } + + void toText(const string &fileName) { + Apteka_st apteka; + std::ifstream file(fileName, std::ios_base::binary); + std::ofstream fileText(fileName + std::string("test.txt")); + if (file.is_open()) { + fileText << "\n"; + fileText.fill(' '); + fileText << std::setw(10) << std::left << "number"; + fileText << std::setw(15) << std::left << "name"; + fileText << std::setw(20) << std::left << "NumberOfPackages"; + fileText << std::setw(10) << std::left << "cost"; + fileText << std::setw(20) << std::left << "data"; + fileText << std::setw(10) << std::left << "time"; + fileText << std::right << "\n"; + fileText << std::right << "\n"; + while (file.read((char *) &apteka, sizeof(apteka))) { + fileText.fill(' '); + fileText << std::setw(10) << std::left << apteka.number; + fileText << std::setw(15) << std::left << apteka.name; + fileText << std::setw(20) << std::left << apteka.NumberOfPackages; + fileText << std::setw(10) << std::left << apteka.cost; + fileText << std::setw(20) << std::left << apteka.data; + fileText << std::setw(10) << std::left << apteka.time; + fileText << std::setw(10) << std::endl; + } + fileText.width(90); + fileText.fill('*'); + fileText << std::right << "\n"; + fileText.close(); + } else std::cout << "File not found" << std::endl; + } + + + void toConsole(const string &fileName) { + Apteka_st apteka; + std::ifstream file(fileName, std::ios_base::binary); + std::ofstream fileText(fileName + std::string("test.txt")); + if (file.is_open()) { + cout << "\n"; + cout.fill(' '); + cout << std::setw(10) << std::left << "number"; + cout << std::setw(15) << std::left << "name"; + cout << std::setw(20) << std::left << "NumberOfPackages"; + cout << std::setw(10) << std::left << "cost"; + cout << std::setw(20) << std::left << "data"; + cout << std::setw(10) << std::left << "time"; + cout << std::right << "\n"; + cout << std::right << "\n"; + while (file.read((char *) &apteka, sizeof(apteka))) { + cout.fill(' '); + cout << std::setw(10) << std::left << apteka.number; + cout << std::setw(15) << std::left << apteka.name; + cout << std::setw(20) << std::left << apteka.NumberOfPackages; + cout << std::setw(10) << std::left << apteka.cost; + cout << std::setw(20) << std::left << apteka.data; + cout << std::setw(10) << std::left << apteka.time; + cout << std::setw(10) << std::endl; + } + + cout << std::right << "\n"; + fileText.close(); + } else std::cout << "File not found" << std::endl; + } +}; + + -- GitLab