diff --git a/WorkWithFile.h b/WorkWithFile.h new file mode 100644 index 0000000000000000000000000000000000000000..b4b31316b28c09dd5ff91ebe3d8a3a656e64fd7f --- /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; + } +}; + +