Загрузка данных


#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>
#include <sstream>

using namespace std;

struct BankAccount {
    int number;
    string owner;
    double balance;
    double rate;
};


int readInt(const string& prompt) {
    string line;
    int value;
    while (true) {
        cout << prompt;
        getline(cin, line);
        istringstream iss(line);
        if (iss >> value && iss.eof()) return value;
        cout << "Ошибка, повторите\n";
    }
}


double readDouble(const string& prompt) {
    string line;
    double value;
    while (true) {
        cout << prompt;
        getline(cin, line);
        istringstream iss(line);
        if (iss >> value && iss.eof()) return value;
        cout << "Ошибка, повторите\n";
    }
}


string readLine(const string& prompt) {
    string s;
    cout << prompt;
    getline(cin, s);
    return s;
}

bool uniqueNumber(const vector<BankAccount>& accs, int num) {
    for (auto& a : accs) if (a.number == num) return false;
    return true;
}

BankAccount inputAccount(const vector<BankAccount>& accs) {
    BankAccount a;
    do {
        a.number = readInt("Номер счета: ");
    } while (a.number <= 0 || !uniqueNumber(accs, a.number));
    a.owner = readLine("Владелец: ");
    a.balance = readDouble("Баланс: ");
    a.rate = readDouble("Ставка (%): ");
    if (a.rate < 0) a.rate = 0;
    return a;
}

void printAll(const vector<BankAccount>& accs) {
    if (accs.empty()) { cout << "Нет счетов\n"; return; }
    for (auto& a : accs)
        cout << a.number << " | " << a.owner << " | " << a.balance << " | " << a.rate << "%\n";
}

void addAccount(vector<BankAccount>& accs) {
    accs.push_back(inputAccount(accs));
}

void deleteAccount(vector<BankAccount>& accs) {
    int num = readInt("Номер счета для удаления: ");
    auto it = remove_if(accs.begin(), accs.end(), [num](BankAccount& a) { return a.number == num; });
    if (it != accs.end()) accs.erase(it, accs.end());
    else cout << "Не найден\n";
}

void editAccount(vector<BankAccount>& accs) {
    int num = readInt("Номер счета для редактирования: ");
    for (auto& a : accs) {
        if (a.number == num) {
            cout << "Текущие: " << a.owner << " " << a.balance << " " << a.rate << "\n";
            string o = readLine("Новый владелец (пусто - без изменений): ");
            if (!o.empty()) a.owner = o;
            double b = readDouble("Новый баланс ( -1 без изменений): ");
            if (b != -1) a.balance = b;
            double r = readDouble("Новая ставка ( -1 без изменений): ");
            if (r != -1 && r >= 0) a.rate = r;
            return;
        }
    }
    cout << "Не найден\n";
}

void negativeBalance(const vector<BankAccount>& accs) {
    bool found = false;
    for (auto& a : accs) if (a.balance < 0) { cout << a.number << " " << a.owner << " " << a.balance << "\n"; found = true; }
    if (!found) cout << "Нет счетов с отрицательным балансом\n";
}

void addInterest(vector<BankAccount>& accs) {
    for (auto& a : accs) a.balance += a.balance * a.rate / 100.0;
    cout << "Проценты начислены\n";
}

void maxBalance(const vector<BankAccount>& accs) {
    if (accs.empty()) return;
    auto m = max_element(accs.begin(), accs.end(), [](BankAccount& x, BankAccount& y) { return x.balance < y.balance; });
    cout << "Макс. баланс: " << m->number << " " << m->owner << " " << m->balance << "\n";
}

void save(const vector<BankAccount>& accs, const string& file) {
    ofstream f(file);
    if (!f) return;
    f << accs.size() << "\n";
    for (auto& a : accs) f << a.number << "|" << a.owner << "|" << a.balance << "|" << a.rate << "\n";
}

void load(vector<BankAccount>& accs, const string& file) {
    ifstream f(file);
    if (!f) return;
    size_t n; f >> n; f.ignore();
    vector<BankAccount> tmp;
    for (size_t i = 0; i < n; i++) {
        string line; getline(f, line);
        if (line.empty()) continue;
        BankAccount a;
        size_t p1 = line.find('|');
        size_t p2 = line.find('|', p1 + 1);
        size_t p3 = line.find('|', p2 + 1);
        a.number = stoi(line.substr(0, p1));
        a.owner = line.substr(p1 + 1, p2 - p1 - 1);
        a.balance = stod(line.substr(p2 + 1, p3 - p2 - 1));
        a.rate = stod(line.substr(p3 + 1));
        tmp.push_back(a);
    }
    accs = tmp;
}

int main() {
    vector<BankAccount> accounts;
    int choice;
    string file = "accounts.txt";
    do {
        cout << "\n1-Ввод 2-Вывод 3-Добавить 4-Удалить 5-Редакт 6-Отриц.баланс 7-Проценты 8-Макс.баланс 9-Сохранить 10-Загрузить 0-Выход\n";
        choice = readInt("Выбор: ");
        switch (choice) {
        case 1: {
            int n = readInt("Количество: ");
            accounts.clear();
            for (int i = 0; i < n; i++)
                accounts.push_back(inputAccount(accounts));
            break;
        }
        case 2: printAll(accounts); break;
        case 3: addAccount(accounts); break;
        case 4: deleteAccount(accounts); break;
        case 5: editAccount(accounts); break;
        case 6: negativeBalance(accounts); break;
        case 7: addInterest(accounts); break;
        case 8: maxBalance(accounts); break;
        case 9: save(accounts, file); break;
        case 10: load(accounts, file); break;
        case 0: break;
        default: cout << "Неверно\n";
        }
    } while (choice != 0);
    return 0;
}