Jak podmienic konkretną linię tekstu w notantniku

0

Bankomat ma 4 klientów. Klient loguje się na swoje konto, jego konto np. ma numer 3, czyli ma dostęp do 9,10 i 11 linii. W 11 linii jest stan konta i gdy klient wpłaci coś na konto to chciałbym aby wartość 11linii zwiększyła się, np. klient ma na początku w banku 9999 i wpłaca 200, i w tedy w 11linii 9999 zamienia się na 1199. Jak to zrobić?

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <conio.h>

using namespace std;

string tlogin[4], thaslo[4];
int tna_start[4];
fstream plik;
string login, haslo, na_start;

class Bankomat
{
public:

    void nowy_klient()
    {
        cout << "Podaj login: ";
        cin >> login;
        cout << "Podaj haslo: ";
        cin >> haslo;
        cout << "Ile wplacasz na start: ";
        cin >> na_start;

        plik.open("klienci.txt", ios::out | ios::app);
        plik << login << endl;
        plik << haslo << endl;
        plik << na_start << endl << endl;
        plik.close();
    }

    void pokaz_klientow()
    {
        int id_klienta = 0;

        plik.open("klienci.txt", ios::in);
        if(plik.good() == false)
        {
            cout << "Blad odczytu pliku";
            exit(0);
        }

        string linia;
        int nr_linii = 1;

        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
                case 1: tlogin[id_klienta] = linia; break;
                case 2: thaslo[id_klienta] = linia; break;
                case 3: tna_start[id_klienta] = atoi(linia.c_str()); break;
            }
            if(nr_linii == 3)
            {
                nr_linii = -1;
                id_klienta++;

            }
            nr_linii++;
        }

        for(int i = 0; i < 4; i++)
        {
            cout << tlogin[i] << endl;
        }

    }
};

int logowanie(int srodki_na_koncie)
{
        int id_klienta = 0;

        plik.open("klienci.txt", ios::in);
        if(plik.good() == false)
        {
            cout << "Blad odczytu pliku";
            exit(0);
        }

        string linia;
        int nr_linii = 1;

        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
                case 1: tlogin[id_klienta] = linia; break;
                case 2: thaslo[id_klienta] = linia; break;
                case 3: tna_start[id_klienta] = atoi(linia.c_str()); break;
            }
            if(nr_linii == 3)
            {
                nr_linii = -1;
                id_klienta++;

            }
            nr_linii++;
        }

        cout << "Podaj login: ";
        cin >> login;
        cout << "Podaj haslo: ";
        cin >> haslo;

        for(int i = 0; i < 4; i++)
        {
            if(login == tlogin[i] && haslo == thaslo[i])
            {
                system("cls");
                cout << "Witaj!: " << login;

                srodki_na_koncie = tna_start[i];


                cout << endl << endl << endl << "Nacisnij dowolny klawisz aby kontynuowac...";
                getch();
                system("cls");
                return srodki_na_koncie;
            }
        }
}

void konto()
{
    int wybor, srodki_na_koncie, wplac;
    srodki_na_koncie = logowanie(srodki_na_koncie);

    while(true)
    {
        cout << "Witaj w naszym banku!" << endl << endl;
        cout << "1. Sprawdz stan konta" << endl;
        cout << "2. Wplac na konto" << endl;
        cout << "3. Wyplac z konta ";
        cout << endl << endl << "Wybor: ";
        cin >> wybor;

        if(wybor == 1)
        {
            system("cls");
            cout << "Srodki na koncie: " <<  srodki_na_koncie;
            getch();
            system("cls");
        }
        if(wybor == 2)
        {
            system("cls");

            cout << "Ile chcesz wplacic na konto: ";
            cin >> wplac;
            
            plik.open("klienci.txt", ios::out);
            

        }
    }
}

int main()
{
    int wybor;
    Bankomat bankomat;

    cout << "== BANKOMAT ==";
    cout << endl << endl;
    cout << "1. Zaloz nowe konto" << endl;
    cout << "2. Pokaz klientow banku" << endl;
    cout << "3. Zaloguj sie" << endl;
    cout << endl << "Wybor: ";
    cin >> wybor;

    if(wybor == 1)
    {
        bankomat.nowy_klient();
    }
    else if(wybor == 2)
    {
        bankomat.pokaz_klientow();
    }
    else if(wybor == 3)
    {
        konto();
    }



    return 0;
}
2

Najprostrzy i najbezpieczniejszy sposób, który zawsze działa to po prostu napisac od nowa cały plik ze zmienioną konkretną linią.

1

@Jonki1997:

  1. czy odróżniasz program Notatnik od formatu "plik tekstowy"? Zazwyczaj są to dwie różne rzeczy. U Ciebie jak widać to samo.

  2. Czy bierzesz pod uwagę współbieżność (tzn. że drugi klient odpala drugą instancję aplikacji a "baza" siedzi na dysku sieciowym)?

Podpowiedź:
Możesz użyć pliku "blokada dostępu":
a) przed zapisem bazy tworzysz plik "baza.lck", jeśli się nie powiodło - czekasz
b) odczytujesz bazę
c) zmieniasz rekord
d) zapisujesz bazę
e) kasujesz plik "baza.lck"

W przypadku jakiejkolwiek awarii lub potrzeby anulowania transakcji w krokach b..d zawsze wykonujesz krok (e) - try/catch.

  1. Plik tekstowy o zmiennej długości rekordu nie służy do przechowywania baz danych swobodnego dostępu.
    Zostaje Ci rozwiązanie podane wyżej.
    Jeśli chcesz to poprawić - zastosuj przynajmniej plik o stałej długości rekordu (ang. "fixed-length record").
0

Ten program to jeszcze nie mój poziom. Wezmę się za coś łatwiejszego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1