Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <Windows.h>
- double valueCheck(std::string);
- class DataBase {
- int age, ID;
- float weight, height;
- std::string name, surname;
- static int count;
- friend void DataBaseCreateArray(DataBase*&, int);
- friend void DataBaseDeleteUser(DataBase*&, int&, int);
- friend std::ostream & operator << (std::ostream&, const DataBase&);
- friend std::istream & operator >> (std::istream&, DataBase&);
- friend void SetCountID(int);
- friend void RefreshIDs(DataBase*&,int);
- void AddUserID() {
- ID = count++;
- }
- public:
- DataBase() {
- name = "Unknown";
- surname = "Unknown";
- age = 0;
- weight = 0;
- height = 0;
- ID = 0;
- }
- DataBase(DataBase& object) {
- age = object.age;
- weight = object.weight;
- height = object.height;
- name = object.name;
- surname = object.surname;
- }
- int GetID() {
- return ID;
- }
- std::string GetName() {
- return name;
- }
- std::string GetSurname() {
- return surname;
- }
- int GetAge() {
- return age;
- }
- float GetWeight() {
- return weight;
- }
- float GetHeight() {
- return height;
- }
- bool operator ==(const DataBase& object) {
- return (name == object.name && surname == object.name && ID == object.ID && age == object.age && weight == object.weight && height == object.height);
- }
- };
- int DataBase::count = 1;
- int main() {
- setlocale(LC_ALL, "ru");
- int size = 0;
- char answer_txt;
- int answer_number;
- std::string path, valuecheck;
- std::fstream fs;
- DataBase* db = nullptr;
- DataBase temp;
- while (true) {
- std::cout << "Список доступных операций:\n1 - Добавить пользователя"
- << "\n2 - Отобразить пользователей"
- << "\n3 - Изменить данные пользователя"
- << "\n4 - Удалить пользователя"
- << "\n5 - Отчистить данные"
- << "\n6 - Открыть файл с базой данных"
- << "\n7 - Записать базу данных в файл"
- << "\ne - Завершить работу"
- << "\nКакую операцию необходимо выполнить? ";
- std::cin >> answer_txt;
- if (answer_txt < 49 || (answer_txt > 55 && answer_txt != 101)) {
- std::cout << "Неверный ответ. Попробуйте снова" << std::endl;
- system("pause");
- std::cout << std::endl;
- continue;
- }
- switch (answer_txt) {
- case '1':
- DataBaseCreateArray(db, size);
- size++;
- system("pause");
- std::cout << std::endl;
- break;
- case '2':
- if (size == 0) {
- std::cout << "Вы ещё не добавили пользователей" << std::endl;
- }
- else {
- std::cout << "ID\tИмя\t\tФамилия\t\tВозраст\tРост\tВес" << std::endl;
- for (int i = 0; i < size; i++) {
- std::cout << db[i];
- }
- }
- system("pause");
- std::cout << std::endl;
- break;
- case '3':
- if (size == 0) {
- std::cout << "Вы ещё не добавили пользователей" << std::endl;
- }
- else {
- while (true) {
- std::cout << "Введите ID пользователя, данные которого необходимо изменить: ";
- std::cin >> valuecheck;
- answer_number = static_cast<int>(valueCheck(valuecheck));
- if (answer_number<1 || answer_number>size) {
- std::cout << "Пользователь с таким ID не найден" << std::endl;
- continue;
- }
- else {
- std::cin >> db[answer_number - 1];
- break;
- }
- }
- }
- system("pause");
- std::cout << std::endl;
- break;
- case '4':
- if (size == 0) {
- std::cout << "Вы ещё не добавили пользователей" << std::endl;
- }
- else {
- std::cout << "Введите ID пользователя, которого необходимо удалить: ";
- std::cin >> valuecheck;
- answer_number = static_cast<int>(valueCheck(valuecheck));
- if (answer_number > size || answer_number < 1) {
- std::cout << "Пользователь с таким ID не найден" << std::endl;
- }
- else {
- DataBaseDeleteUser(db, size, answer_number);
- }
- }
- system("pause");
- std::cout << std::endl;
- break;
- case '5':
- if (size == 1) {
- delete db;
- size = 0;
- SetCountID(0);
- }
- else if (size > 1) {
- delete[]db;
- size = 0;
- SetCountID(0);
- }
- else {
- std::cout << "База данных - пустая" << std::endl;
- }
- system("pause");
- std::cout << std::endl;
- break;
- case '6':
- std::cout << "Введите имя файла с БД без расширения: ";
- SetConsoleCP(1251);
- std::cin >> path;
- SetConsoleCP(866);
- path = path + ".data";
- fs.open(path, std::fstream::in | std::fstream::binary);
- if (!fs.is_open()) {
- std::cout << "Файл с БД не найден" << std::endl;
- }
- else {
- fs.seekg(0, std::ios::end); //ставит указатель в конец файла
- if (fs.tellg() % sizeof(DataBase) != 0) { //fs.tellg принимает значение метода seekg
- std::cout << "Ошибка чтения файла" << std::endl;
- }
- else {
- if (size != 0) {
- if (size == 1) {
- delete db;
- db = nullptr;
- }
- else {
- delete[]db;
- db = nullptr;
- }
- }
- size = fs.tellg() / sizeof(DataBase);
- fs.seekg(0, std::ios::beg); //возвращает указатель в начало файла
- if (size < 2) {
- if (size == 1) {
- db = new DataBase;
- }
- }
- else {
- db = new DataBase[size];
- }
- if (size != 0) {
- for (int i = 0; i < size; i++) {
- fs.read((char*)&temp, sizeof(DataBase));
- db[i] = temp; //костыль. Если принимать данные сразу в массив, то потом, при удалении, компилятор выдает ошибку.
- }
- SetCountID(0);
- RefreshIDs(db,size);
- SetCountID(size+1);
- }
- }
- }
- fs.close();
- system("pause");
- std::cout << std::endl;
- break;
- case '7':
- if (size == 0) {
- std::cout << "Вы ещё не добавили пользователей" << std::endl;
- }
- else {
- std::cout << "Введите имя файла без расширения: ";
- SetConsoleCP(1251);
- std::cin >> path;
- SetConsoleCP(866);
- path = path + ".data";
- fs.open(path, std::fstream::out | std::fstream::binary | std::fstream::trunc);
- for (int i = 0; i < size; i++) {
- fs.write((char*)&db[i], sizeof(DataBase));
- }
- fs.close();
- }
- system("pause");
- std::cout << std::endl;
- break;
- case 'e':
- if (size == 1) {
- delete db;
- }
- else if (size > 1) {
- delete[]db;
- }
- return 0;
- break;
- }
- }
- }
- void DataBaseCreateArray(DataBase*&object, int size) {
- if (size == 0) {
- object = new DataBase;
- object[size].AddUserID();
- std::cin >> object[size];
- }
- else {
- DataBase* newDB = new DataBase[size + 1];
- for (int i = 0; i < size; i++) {
- newDB[i] = object[i];
- }
- if (size == 1) {
- delete object;
- }
- else {
- delete[]object;
- }
- object = newDB;
- newDB = nullptr;
- object[size].AddUserID();
- std::cin >> object[size];
- }
- }
- void DataBaseDeleteUser(DataBase*&object, int&size, int UserID) {
- DataBase* newData = new DataBase[size - 1];
- for (int i = 0, j = 0; i < size; i++, j++) {
- if (object[i] == object[UserID - 1]) {
- for (int temp = i; temp < size; temp++) {
- object[temp].ID--;
- }
- j--;
- continue;
- }
- newData[j] = object[i];
- }
- if (size == 1) {
- delete object;
- }
- else {
- delete[]object;
- }
- object = newData;
- newData = nullptr;
- size--;
- object[size].count--;
- if (size == 1) {
- DataBase *newDB = new DataBase;
- newDB[0] = object[0];
- delete[]object;
- object = newDB;
- newDB = nullptr;
- }
- }
- std::ostream & operator << (std::ostream&os, const DataBase&object) {
- os << object.ID << "\t" << object.name << "\t\t" << object.surname << "\t\t"
- << object.age << "\t" << object.height << "\t" << object.weight << "\n";
- return os;
- }
- std::istream & operator >> (std::istream&is, DataBase&object) {
- std::string valuecheck;
- std::cout << "Введите имя пользователя: ";
- SetConsoleCP(1251);
- std::cin >> object.name;
- SetConsoleCP(866);
- std::cout << "Введите фамилию пользователя: ";
- SetConsoleCP(1251);
- std::cin >> object.surname;
- SetConsoleCP(866);
- std::cout << "Введите возраст пользователя: ";
- std::cin >> valuecheck;
- object.age = static_cast<int>(valueCheck(valuecheck));
- std::cout << "Введите рост пользователя: ";
- std::cin >> valuecheck;
- object.height = static_cast<float>(valueCheck(valuecheck));
- std::cout << "Введите вес пользователя: ";
- std::cin >> valuecheck;
- object.weight = static_cast<float>(valueCheck(valuecheck));
- return is;
- }
- double valueCheck(std::string value) {
- int temp;
- for (int i = 0; i < value.size(); i++) {
- if (value[i] == '.') {
- value[i] = ',';
- }
- if (value[i] == ',') {
- temp = i + 1;
- for (; temp < value.size(); temp++) {
- if (value[temp] == ',' || value[temp] == '.') {
- for (; temp < value.size(); temp++) {
- value[temp] = value[temp + 1];
- }
- temp = i + 1;
- }
- }
- }
- if ((value[i] < 48 && value[i] != 43 && value[i] != 44 && value[i] != 45 && value[i] != 0) || value[i] > 57) {
- temp = i;
- for (; temp < value.size(); temp++) {
- value[temp] = value[temp + 1];
- }
- i--;
- }
- }
- if (value[0] == '\0') {
- value[0] = '0';
- value[1] = '\0';
- }
- return std::stod(value);
- }
- void SetCountID(int value) {
- DataBase::count = value;
- }
- void RefreshIDs(DataBase*&object, int size) {
- for (int i = 0; i < size; i++) {
- object[i].ID = i + 1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment