Problem z logowaniem do programu

0

Witam,

Piszę program, w którym rejestruję kilka osób do książki adresowej, aby później stworzyć funkcję logowania. Przy rejestracji stwarzam plik tekstowy, które zapisuje użytkowników. Przy rejestracji np. 3 użytkowników i próbie zalogowania, np. drugiego użytkownika, program rozpoznaje login i hasło tylko pierwszej osoby. Kolejne są traktowane tak jakby ich nie było, a w pliku tekstowym istnieją.

#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
#include <fstream>
#include <sstream>
 
using namespace std;
 
struct Uzytkownik
{
    int idUzytkownika = 0;
    string login, haslo;
};
 
vector <Uzytkownik> uzytkownicy;
 
int zarejestrujUzytkownika (vector <Uzytkownik> &uzytkownicy, int iloscUzytkownikow)
{
    string login, haslo;
    int idUzytkownika = 0;
    Uzytkownik pomoc;
 
    if(uzytkownicy.size() == 0)
    {
        idUzytkownika = 1;    //jezeli ksiazka jest pusta pierwszy  osoba ma ID 1
    }
    else
    {
        idUzytkownika = uzytkownicy[uzytkownicy.size() - 1].idUzytkownika + 1;
    }
 
    cout << "Podaj login: ";
    cin >> login;
    cin.sync();
    cout << "Podaj haslo: ";
    cin >> haslo;
    cout << "Rejsetracja przebiegla pomyslnie" << endl;
    Sleep(1000);
 
    pomoc.idUzytkownika = idUzytkownika;
    pomoc.login = login;
    pomoc.haslo = haslo;
 
    uzytkownicy.push_back(pomoc);
 
    //zapisz do pliku
    fstream plikDoZapisu;
    plikDoZapisu.open("Uzytkownicy.txt", ios::out | ios::app);
 
    if (plikDoZapisu.good() == true)
        {
            plikDoZapisu << pomoc.idUzytkownika << "|" << pomoc.login << "|" << pomoc.haslo << "|" << endl;
            plikDoZapisu.close();
        }
    else
        {
            cout << "Nie udalo sie otworzyc pliku";
            system("pause");
        }
 
}
 
void przejdzDoMenuLogowania()
{
    system("cls");
    cout << "Witaj w Ksiazce Adresowej!" << endl;
    cout << "Wybierz jedna z ponizszych opcji: " << endl;
    cout << "1. Logowanie" << endl;  cout << "2. Rejestracja" << endl; cout << "3. Zakoncz program" << endl;
}
 
int zalogujUzytkownika(vector <Uzytkownik> &uzytkownicy, int iloscUzytkownikow)
{
    string login = "", haslo = "";
    cout << "Podaj login: ";
    cin.sync();
    cin >> login;
    cin.sync();
    vector <Uzytkownik>::iterator itr = uzytkownicy.begin();
    for (itr; itr != uzytkownicy.end(); itr++)
        {
            if (itr->login == login)
                {
                    cout << "Podaj haslo: ";
                    cin >> haslo;
                    if (itr->haslo == haslo)
                    {
                        cout << "Zostales zalogowany." << endl;
                        Sleep(1000);
                        return itr->idUzytkownika;
                        //iloscUzytkownikow++;
                    }
                    else
                    {
                        cout << "Podales bledne haslo!! Sprobuj ponownie: ";
                        cin >> haslo;
                    }
                    cout << "Znowu podales zle haslo!! Koniec programu!";
                    exit(0);
                }
                else
                {
                    cout << "Podales zly login. Nie ma takiego uzytkownika!!" << endl;
                    Sleep(1000);
                    exit(0);
                }
        }
 
        return 0;
}
 
vector <Uzytkownik> rozdzielDaneUzytkonikaNaPojedynczeLinie(vector <Uzytkownik> &uzytkownicy, string liniaDoOdczytania, char znakPionowejKreski)
{
    Uzytkownik pomoc;
    int nrLinii = 1;
    stringstream ss(liniaDoOdczytania);
    string pojedynczaDana = " ";
 
    while (getline(ss, pojedynczaDana, znakPionowejKreski))
    {
        switch(nrLinii)
        {
            case 1:
                pomoc.idUzytkownika = atoi(pojedynczaDana.c_str());
                break;
            case 2:
                pomoc.login = pojedynczaDana;
                break;
            case 3:
                pomoc.haslo = pojedynczaDana;
                break;
 
        }
        nrLinii++;
    }
    uzytkownicy.push_back(pomoc);
 
    return uzytkownicy;
}
 
int wczytajPlikUzytkownicy(vector <Uzytkownik> &uzytkownicy)
{
    string liniaTesktu;
    int nrLinii = 1;
    fstream plikDoOdczytu;
 
    plikDoOdczytu.open("Uzytkownicy.txt", ios::in);
    if(plikDoOdczytu.good() == true)
    {
        while (getline(plikDoOdczytu, liniaTesktu))
        {
            uzytkownicy = rozdzielDaneUzytkonikaNaPojedynczeLinie(uzytkownicy, liniaTesktu, '|');
        }
    }
    plikDoOdczytu.close();
}
 
 
void zamknijProgram()
{
    exit(0);
}
 
int main()
{
    int iloscUzytkownikow = 0;
    int iloscOsob = 0;
    int idZalogowanegoUzytkownika = 0;
    char wybor;
 
    iloscUzytkownikow = wczytajPlikUzytkownicy(uzytkownicy);
 
    while(1)
    {
        if(idZalogowanegoUzytkownika == 0)
        {
            przejdzDoMenuLogowania();
            cin >> wybor;
            cin.sync();
 
            switch(wybor)
            {
                case '1':
                idZalogowanegoUzytkownika = zalogujUzytkownika(uzytkownicy, iloscUzytkownikow);
                if(idZalogowanegoUzytkownika != 0)
                {
                    iloscOsob = wczytajPlikZDanymiAdresatow(adresaci, idZalogowanegoUzytkownika);
                }
                break;
 
                case '2':
                    iloscUzytkownikow = zarejestrujUzytkownika(uzytkownicy, iloscUzytkownikow);
                    break;
 
                case '3':
                    zamknijProgram();
                    break;
            }
        }
    }
 
   return 0;
 
}
4

Problem prawdopodobnie umiejscowiony jest w funkcji:

int zalogujUzytkownika(vector <Uzytkownik> &uzytkownicy, int iloscUzytkownikow)
{
   .........
}

Jeżeli pierwszy login nie jest prawidłowy, aplikacja zostaje zakończona instrukcją exit(0), bez szansy na sprawdzenie następnych.

Zobacz jak można napisać fragment kodu sprawdzający login i hasło użytkownika:

C++20

#include <iostream>
#include <vector>
#include <optional>

using namespace std;

struct Credential
{
    string login,password;
    auto operator<=>(const Credential&) const = default;
};

struct User
{
    int id {0};
    Credential credential;
};

istream& operator>>( istream &in , Credential &credential )
{
    cin >> credential.login >> credential.password;
    return in;
}

optional<int> login( const vector<User>& users , const Credential& credential )
{    
    for( const auto& user : users ) if( user.credential == credential ) return optional<int>{user.id};
    return nullopt;
}

int main()
{
    vector<User> users { {1,"login1","password1"} , {2,"login2","password2"} , {3,"login3","password3"} };

    Credential credential;
    cout << "Enter login and password" << endl;
    cin >> credential;

    auto id = login( users , credential );

    cout << ( id != nullopt  ? "User " + to_string(*id) : "Wrong"s );
}

https://godbolt.org/z/9vnnezjdj

0

@TomaszLiMoon: Dzięki za kod oraz podpowiedź - już znalazłam błąd.

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