• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[PROBLEM] Program do logowania i rejestracji?

VPS Starter Arubacloud
+1 głos
624 wizyt
pytanie zadane 28 sierpnia 2015 w C i C++ przez niezalogowany
edycja 14 maja 2018

Próbuję stworzyć prosty system do rejestracji i logowania, który pobierałby dane rejestrującego się i zapisywał w pliku txt, tak żeby zalogowanie się było możliwe nawet po zamknięciu programu i ponownym uruchomieniu. Napisałem kod, ale najwyraźniej nie jest poprawny, program nie chce się uruchomić. Jestem ciekaw, czy to co napisałem ma wgl. jakiś sens, jeżeli nie, to chętnie przyjmę porady typu "co i jak zmienić" od jakichś mądrych główlaugh.

 

KOD:

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <conio.h>
#include <fstream>


using namespace std;
char decyzja;
string imie[100],login[100],haslo[100];
string imie0,login0,haslo0;
string login2,haslo2;

string linia;
int nr_linii=1;
int nr_danych=0;


int main()
{

    for (;;)
    {

    cout << "<EKRAN STARTOWY>" << endl;
    cout<<endl;
       cout<<endl;
    cout<<"LOGOWANIE -> WYBIERZ 1  REJESTRACJA -> WYBIERZ 2"<< endl;


decyzja=getch();
system("cls");

switch(decyzja)
{
case '1':
    cout<<"<EKRAN LOGOWANIA>"<<endl;
     cout<<endl;
    cout<<"Login: ";
    cin>> login2;
    cout<<endl;
    cout<<"Haslo: ";
    cin>>haslo2;


fstream plik;
plik.open("danelogowania.txt");
while (getline(plik,linia))

{
    switch(nr_linii)
    {
        case 1: imie[nr_danych]=linia; break;
        case 2: login[nr_danych]=linia; break;
        case 3: haslo[nr_danych] = linia; break;

    }

    if (((login[nr_danych]!=login2) || (haslo[nr_danych]!= haslo2))&& (nr_linii==3) )

    {
        nr_linii=0;
        nr_danych++;
    }


   else if ((login[nr_danych]==login2) && (haslo[nr_danych]== haslo2) )

        {
        system("cls");
        cout<<"ZALOGOWANO"<<endl;
        cout<<endl;
        cout<<"WITAJ: "<<imie[nr_danych]<<endl;
        getch();
        system("cls");
    }

    else
    {


        system("cls");
        cout<<"NIEPOPRAWNY LOGIN LUB HASLO";
        getch();
        system("cls");
    }


    nr_linii++;
}


plik.close();


    break;


case'2':

    cout<<"<EKRAN REJESTRACJI>"<<endl;
     cout<<endl; cout<<endl;
    cout<<"Imie: ";
    cin>>imie0;
    cout<<endl;
    cout<<"Login: ";
    cin>>login0;

    cout<<endl;
    cout<<"Haslo: ";
    cin>>haslo0;
    cout<<endl;
    cout<<"ZAREJESTROWANO!";
    getch();
    system("cls");

fstream plik;

    plik.open("danelogowania.txt", ios :: out, ios :: app);

    plik<<imie0<<endl;
    plik<<login0<<endl;
    plik<<haslo0<<endl;

    plik.close();


    break;
}

    }

    return 0;
}

 

 

2 odpowiedzi

0 głosów
odpowiedź 28 sierpnia 2015 przez arek01996 Stary wyjadacz (12,100 p.)

Try now:

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <conio.h>
#include <fstream>


using namespace std;
char decyzja;
string imie[100],login[100],haslo[100];
string imie0,login0,haslo0;
string login2,haslo2;

string linia;
int nr_linii=1;
int nr_danych=0;


int main()
{

    for (;;)
    {

        cout << "<EKRAN STARTOWY>" << endl;
        cout<<endl;
        cout<<endl;
        cout<<"LOGOWANIE -> WYBIERZ 1  REJESTRACJA -> WYBIERZ 2"<< endl;


        decyzja=getch();
        system("cls");

        switch(decyzja)
        {
        case '1':
            {

            cout<<"<EKRAN LOGOWANIA>"<<endl;
            cout<<endl;
            cout<<"Login: ";
            cin>> login2;
            cout<<endl;
            cout<<"Haslo: ";
            cin>>haslo2;


            fstream plik;
            plik.open("danelogowania.txt");
            while (getline(plik,linia))

            {
                switch(nr_linii)
                {
                case 1:
                    imie[nr_danych]=linia;
                    break;
                case 2:
                    login[nr_danych]=linia;
                    break;
                case 3:
                    haslo[nr_danych] = linia;
                    break;

                }

                if (((login[nr_danych]!=login2) || (haslo[nr_danych]!= haslo2))&& (nr_linii==3) )

                {
                    nr_linii=0;
                    nr_danych++;
                }


                else if ((login[nr_danych]==login2) && (haslo[nr_danych]== haslo2) )

                {
                    system("cls");
                    cout<<"ZALOGOWANO"<<endl;
                    cout<<endl;
                    cout<<"WITAJ: "<<imie[nr_danych]<<endl;
                    getch();
                    system("cls");
                }

                else
                {


                    system("cls");
                    cout<<"NIEPOPRAWNY LOGIN LUB HASLO";
                    getch();
                    system("cls");
                }


                nr_linii++;
            }


            plik.close();

        }
            break;


        case'2':
{


            cout<<"<EKRAN REJESTRACJI>"<<endl;
            cout<<endl;
            cout<<endl;
            cout<<"Imie: ";
            cin>>imie0;
            cout<<endl;
            cout<<"Login: ";
            cin>>login0;

            cout<<endl;
            cout<<"Haslo: ";
            cin>>haslo0;
            cout<<endl;
            cout<<"ZAREJESTROWANO!";
            getch();
            system("cls");

            fstream plik;

            plik.open( "danelogowania.txt", ios::out);

            plik<<imie0<<endl;
            plik<<login0<<endl;
            plik<<haslo0<<endl;

            plik.close();
}

            break;
        }

    }

    return 0;
}

 

komentarz 28 sierpnia 2015 przez arek01996 Stary wyjadacz (12,100 p.)
edycja 28 sierpnia 2015 przez arek01996
Dodałem {} do case'ów oraz usunąłem ios::app Pierwszy raz się z czym takim spotkałem, że ktoś używa z ios::out ;)
komentarz 28 sierpnia 2015 przez niezalogowany
edycja 14 maja 2018

aha, to chyba nie wróźy nic dobrego smiley.

komentarz 28 sierpnia 2015 przez niezalogowany
edycja 14 maja 2018
Spróbowałem, program się odpala, rejestracja dziala, ale cos  z logowaniem jest nie tak.
komentarz 28 sierpnia 2015 przez arek01996 Stary wyjadacz (12,100 p.)
Działa tylko wyjdz z pętli jak się zalogujesz.
komentarz 28 sierpnia 2015 przez arek01996 Stary wyjadacz (12,100 p.)

np tutaj pętle po wczytaniu zamykam i działa:

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <conio.h>
#include <fstream>


using namespace std;
char decyzja;
string imie[100],login[100],haslo[100];
string imie0,login0,haslo0;
string login2,haslo2;

string linia;
int nr_linii=1;
int nr_danych=0;


int main()
{

    for (;;)
    {

        cout << "<EKRAN STARTOWY>" << endl;
        cout<<endl;
        cout<<endl;
        cout<<"LOGOWANIE -> WYBIERZ 1  REJESTRACJA -> WYBIERZ 2"<< endl;


        decyzja=getch();
        system("cls");

        switch(decyzja)
        {
        case '1':
        {

            cout<<"<EKRAN LOGOWANIA>"<<endl;
            cout<<endl;
            cout<<"Login: ";
            cin>> login2;
            cout<<endl;
            cout<<"Haslo: ";
            cin>>haslo2;


            fstream plik;
            plik.open("danelogowania.txt");
            while (getline(plik,linia))

            {
                switch(nr_linii)
                {
                case 1:
                    imie[nr_danych]=linia;
                    break;
                case 2:
                    login[nr_danych]=linia;
                    break;
                case 3:
                    haslo[nr_danych] = linia;
                    break;

                }

                nr_linii++;
            }

            if (((login[nr_danych]!=login2) || (haslo[nr_danych]!= haslo2))&& (nr_linii==3) )

            {
                nr_linii=0;
                nr_danych++;
            }


            else if ((login[nr_danych]==login2) && (haslo[nr_danych]== haslo2) )

            {
                system("cls");
                cout<<"ZALOGOWANO"<<endl;
                cout<<endl;
                cout<<"WITAJ: "<<imie[nr_danych]<<endl;
                getch();
                system("cls");
            }

            else
            {


                system("cls");
                cout<<"NIEPOPRAWNY LOGIN LUB HASLO";
                getch();
                system("cls");
            }

            plik.close();

        }
        break;


        case'2':
        {


            cout<<"<EKRAN REJESTRACJI>"<<endl;
            cout<<endl;
            cout<<endl;
            cout<<"Imie: ";
            cin>>imie0;
            cout<<endl;
            cout<<"Login: ";
            cin>>login0;

            cout<<endl;
            cout<<"Haslo: ";
            cin>>haslo0;
            cout<<endl;
            cout<<"ZAREJESTROWANO!";
            getch();
            system("cls");

            fstream plik;

            plik.open( "danelogowania.txt", ios::out);

            plik<<imie0<<endl;
            plik<<login0<<endl;
            plik<<haslo0<<endl;

            plik.close();
        }

        break;
        }

    }

    return 0;
}

 

komentarz 28 sierpnia 2015 przez criss Mędrzec (172,590 p.)
arek, ios::out pozwala na zapis do pliku.  Z tym, że plik jest nadpisywany i tracisz wszystko co było zapisane wcześniej. Dzięki ios::app możesz dopisywać do pliku.
komentarz 28 sierpnia 2015 przez arek01996 Stary wyjadacz (12,100 p.)
dzięki. Zawsze coś nowego sie można dowiedzieć :)
0 głosów
odpowiedź 28 sierpnia 2015 przez criss Mędrzec (172,590 p.)

Po pierwsze: dlaczego ify sprawdzające poprawnosc loginu i hasła są wewnątrz pętli wczytującej dane? W taki sposób ZAWSZE 2 razy ci wyrzuci komunikat o niepoprawnych danych i za 3 razem (jesli podales dobre dane) to sie zalogujesz.

Po drugie: jeśli cchesz wewnątrz case-a deklarować jakieś zmienne to case powinien być w klamrach (tym bardziej że w obu case-ach fstream został zadeklarowany z tą samą nazwą), inaczej dostaniesz error "crosses initialization...".
Ma to wygladac tak:
 

case 1:{
           fstream plik;
            //kod
}

case 2:{
           fstream plik;
            //kod
}

Po trzecie -  fstream.open() ma 2 argumenty, nie możesz podawać ios::out i ios::app po przecinku. Tutaj się używa | - bodajże suma binarna to się nazywa. 
 

pik.open("danelogowania.txt", ios::out | ios::app);

Po naprawieniu 2 i 3 błędu powinno się kompilować, ale popracuj nad umiejscowieniem instrukcji (chociazby te ify w pętli). Nie sprawdzałem też jak to się wszystko zachowuje przy większej liczbe zarejestrowanych. Poczytaj o std::vector, przyda ci się.

komentarz 28 sierpnia 2015 przez niezalogowany
edycja 14 maja 2018
Dzięki wielkie, spróbuję poprawić.
komentarz 28 sierpnia 2015 przez niezalogowany
edycja 14 maja 2018

Poprawiłem, program się odpala. Rejestracja działa,bo pliki zapisują się w pliku.txt. Z tym,że logowanie szwankuje, po wpisaniu danych ponownie wyswietla się ekran startowy, to samo dzieje się po wpisaniu błędnych danych. Zamieszczam kod (poprawiony, tak jak mówiłeś).

 

 

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <conio.h>
#include <fstream>


using namespace std;
char decyzja;
string imie[100],login[100],haslo[100];
string imie0,login0,haslo0;
string login2,haslo2;

string linia;
int nr_linii=1;
int nr_danych=0;


int main()
{

    for (;;)
    {

        cout << "<EKRAN STARTOWY>" << endl;
        cout<<endl;
        cout<<endl;
        cout<<"LOGOWANIE -> WYBIERZ 1  REJESTRACJA -> WYBIERZ 2"<< endl;


        decyzja=getch();
        system("cls");

        switch(decyzja)
        {
        case '1':
        {

            cout<<"<EKRAN LOGOWANIA>"<<endl;
            cout<<endl;
            cout<<"Login: ";
            cin>> login2;
            cout<<endl;
            cout<<"Haslo: ";
            cin>>haslo2;


            fstream plik;
            plik.open("danelogowania.txt", ios::in);
            while (getline(plik,linia))

            {
                switch(nr_linii)
                {
                case 1:
                    imie[nr_danych]=linia;
                    break;
                case 2:
                    login[nr_danych]=linia;
                    break;
                case 3:
                    haslo[nr_danych] = linia;
                    break;

                }

                nr_linii++;
            }



            plik.close();

        }
        break;


        case'2':
        {


            cout<<"<EKRAN REJESTRACJI>"<<endl;
            cout<<endl;
            cout<<endl;
            cout<<"Imie: ";
            cin>>imie0;
            cout<<endl;
            cout<<"Login: ";
            cin>>login0;

            cout<<endl;
            cout<<"Haslo: ";
            cin>>haslo0;
            cout<<endl;
            cout<<"ZAREJESTROWANO!";
            getch();
            system("cls");

            fstream plik;

            plik.open( "danelogowania.txt", ios::out | ios::app);

            plik<<imie0<<endl;
            plik<<login0<<endl;
            plik<<haslo0<<endl;

            plik.close();
        }

        break;
        }

    }


 if (((login[nr_danych]!=login2) || (haslo[nr_danych]!= haslo2))&& (nr_linii==3) )

            {
                nr_linii=0;
                nr_danych++;
            }


            else if ((login[nr_danych]==login2) && (haslo[nr_danych]== haslo2) )

            {
                system("cls");
                cout<<"ZALOGOWANO"<<endl;
                cout<<endl;
                cout<<"WITAJ: "<<imie[nr_danych]<<endl;
                getch();
                system("cls");
            }

            else
            {


                system("cls");
                cout<<"NIEPOPRAWNY LOGIN LUB HASLO";
                getch();
                system("cls");
            }
    return 0;
}

 

komentarz 28 sierpnia 2015 przez criss Mędrzec (172,590 p.)
Ekhm, no ify są poza główną pętlą (nieskończoną z resztą). Po prstu wrzuć je w pętle zaraz po switchu. Btw. uzywaj while(true), ładniej wygląda niż for(;;) :P
komentarz 28 sierpnia 2015 przez niezalogowany
edycja 14 maja 2018
Dałem ify po switchu, logowanie działa, ale tylko dla jednego uzytkownika. No cóż,dziękuję za pomoc, potem z tym zawalczę. Czy mógłbym napisac do cb na PW w razie, gdybym dalej miał problem z tym kodem?
komentarz 28 sierpnia 2015 przez criss Mędrzec (172,590 p.)
Jeszcze jutro go przejrzę chociaż łatwiej jest mi raczej napisac swoją wersję niż poprawiać czyjąś :D jasne, pisz kiedy chcesz.

Podobne pytania

0 głosów
3 odpowiedzi 472 wizyt
pytanie zadane 12 września 2015 w C i C++ przez niezalogowany
+1 głos
6 odpowiedzi 247 wizyt
pytanie zadane 26 sierpnia 2015 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 167 wizyt
pytanie zadane 9 listopada 2019 w C i C++ przez Karpik Użytkownik (680 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...