Jak zrobić czytanie w notaniku np. od 5 linii

0

Witam! Mam problem. Zrobiłem taką prościutką bazę danych w notatniku. Potrafię zalogować się do jednej osoby, która ma dane w 1,2 i 3 linii. Gdy chce zrobić drugiego klienta to jak mam zrobić czytanie tych danych od 5 linii. Mam tak: 1 linia = login 2 linia= hasło 3 linia - stan konta i potem 4 linia przerwa i od piątej znowu, 5 linia = login itd.

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

using namespace std;

void bankomat();

int srodki_na_koncie;

class Bankomat
{
public:

    string login, t_login, haslo, t_haslo;
    int id_klient, wplac_na_start;
    fstream plik;

    void nowy_klient()
    {
        cout << "Podaj login: ";
        cin >> login;
        cout << "Podaj haslo: ";
        cin >> haslo;
        cout << "Jaka sume chcesz wplacic na poczatek: ";
        cin >> wplac_na_start;

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

    void zaloguj_sie()
    {
        plik.open("klienci.txt", ios::in);
        if(plik.good() == false)
        {
            cout << "Blad wczytywania danych!";
            exit(0);
        }

        string linia;
        int nr_linii = 1;


        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
                case 1: login = linia; break;
                case 2: haslo = linia; break;
                case 3: srodki_na_koncie = atoi(linia.c_str()); break;
            }
            nr_linii++;
        }
        plik.close();

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

        if(t_login == login && t_haslo == haslo)
        {
            cout << "Zalogowales sie!";
            getch();
            system("cls");
            bankomat();
        }
    }
};

void bankomat()
{
    int wybor, wplac;

    while(true)
    {
        cout <<  "Witaj w banku!";
        cout << endl << endl << endl << "1. Sprawdz srodki na koncie";
        cout << endl << "2. Wplac srodki na konto";
        cout << endl << endl << "Wybor: ";
        cin >> wybor;
        if(wybor == 1)
        {
            system("cls");
            cout << "Srodki na koncie: " << srodki_na_koncie << " PLN";
            getch();
        }
        if(wybor == 2)
        {
            system("cls");
            cout << "Ile chcesz wplacic na konto?: ";
            cin >> wplac;

            srodki_na_koncie += wplac;
            getch();
        }
    }

}

int main()
{
    int wybor;
    Bankomat bankomat;

    cout << "Witaj w naszym bankomacie!" << endl << endl;
    cout << "1. Zaloz konto w banku" << endl;
    cout << "2. Zaloguj sie" << endl << endl;
    cout << "Wybor: ";
    cin >> wybor;

    if(wybor == 1)
    {
        bankomat.nowy_klient();
    }
    if(wybor == 2)
    {
        bankomat.zaloguj_sie();
    }

    return 0;
}
1

Po prostu zignoruj pierwsze pięć linii.

string tmp;
for(int i = 0; i < 5; i++) geltline(cin, tmp);
1

Wiem, że nie pytasz konkretnie o to, ale radzę Ci zmienić kolejność działań w metodzie zaloguj_sie. obecnie masz tak:

  1. wczytujesz linie odpowiednie do zmiennych
  2. pobierasz od użytkownika login&hasło,
  3. sprawdzasz czy to co masz jest zgodne z tym co dał użytkownik.

Przy takiej konstrukcji automagicznie wykluczasz sobie możliwość sprawdzania logowania w większej ilości klientów. Poza tym, przy takiej konstrukcji bazy, nie musisz używać kodu @kq bo po prostu nie musisz przeskakiwać pól. Oto jak powinieneś zawrzeć metodę logowania:

  1. Pobierasz od użytkownika login i hasło
  2. wczytujesz pola logowania, hasła, kasy i puste
  3. jeśli login od usera = login odczytany, to sprawdzasz hasło jak jest ok, wtedy masz użytkownika zalogowanego i wszystko wczytane, jak nie, powtórz od pkt 2 (czyli Twój while)

przeskakiwanie pól, będzie Ci potrzebne kiedy będziesz chciał zapisać nowe środki na koncie użytkownika po wypłaceni :)

1

W notatniku to robi się tak:

  • Plik \ Otwórz \ Wybieram plik
  • Kursor klawiatury dół x4
  • czytam (na głos lub po cichu)

... ;-)

0

@Jonki1997 co jeżeli ktoś założy sobie konto z takim samym loginem i hasłem jak ktoś inny? Mogłeś poczytać trochę więcej i podzielić to na co najmniej KontoBankowe Bankomat a std::cin std::cout wywalić spoza klasy.

0

Mam jeszcze pytanie z innej beczki. Napisałem sobie taki kod z pomocą tutka, ale nie rozumiem za bardzo jego działania. Zrobiłem w notatniku tak: 1linia - login 2linia - hasło 3linia - stan konta, potem czwarta linia przerwa i od nowa 5linia - login itd., i tak stworzyłem 4 konta. Program sprawdza linia po linii i gdy sprawdzi 3 linie to nr_linii zmienia na -1, następnie inkrementacja czyli nr_linii = 0, a przecież nie ma zerowej linii i w jaki to sposób przechodzi do 5 linii. Pętlą for wyświetlam login[i] i dobrze wyświetla 1, 5, 9, 13 linie. Działa dobrze, ale nie rozumiem jak to działa. Mógłby ktoś to wytłumaczyć? Sory, że tak skomplikowanie opisałem moje pytanie, ale nie wiedziałem jak je sformułować.

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

using namespace std;

int main()
{
    string login[4], haslo[4];
    string stan_konta[4];
    int id_klienta = 0;

    int nr_linii = 1;
    string linia;

    fstream plik;

    plik.open("klienci.txt", ios::in);

    if(plik.good() == false)
    {
        cout << "Blad odczytu!";
        exit(0);
    }

    while(getline(plik, linia))
    {
        switch(nr_linii)
        {
            case 1: login[id_klienta] = linia; break;
            case 2: haslo[id_klienta] = linia; break;
            case 3: stan_konta[id_klienta] = linia; break;
        }
        if(nr_linii == 3){ nr_linii = -1; id_klienta++;}
        nr_linii++;
    }
    plik.close();

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

    return 0;
}
0

To proste: jeśl nr lini = 3, to przypisz mu -1 (już po przemieleniu switcha), następnie zwiększ o 1, potem odczyta pustą linie, switch nic nie zrobi, jedynie nr lini się zeiœkszy (już mamy 1) i następna linia będzie już 1 i się zgadza, że to login.

0

Zrobiłem jeszcze raz identyczny kod jak poprzedni, ale ten nie chce działać. Nie wiem o co chodzi.

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

using namespace std;

int main()
{
    string login[4], haslo[4], stan_konta[4];
    int id_klienta = 0;

    int nr_linii = 1;
    string linia;

    fstream plik;

    plik.open("klienci.txt", ios::in);

    if(plik.good() == false)
    {
        cout << "Blad wczytywania danych!";
        exit(0);
    }

    while(getline(plik, linia))
    {
        switch(nr_linii)
        {
            case 1: login[id_klienta] == linia; break;
            case 2: haslo[id_klienta] == linia; break;
            case 3: stan_konta[id_klienta] == linia; break;
        }

        if(nr_linii == 3)
        {
            nr_linii = -1;
            id_klienta++;
        }
        nr_linii++;
    }
    plik.close();

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

    return 0;
}
0

Wypadałoby powiedzieć więcej niż "nie chce działać"

            case 1: login[id_klienta] == linia; break;
            case 2: haslo[id_klienta] == linia; break;
            case 3: stan_konta[id_klienta] == linia; break;

Przyrównujesz zamiast przypisywać.

Ponadto nigdzie nie sprawdzasz, czy nie piszesz poza tablicą login/haslo/stan_konta co jest bardzo niebezpieczne.

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