Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Błąd przy wyświetlania komunikatu o niepoprawnych danych logowania

Ostatnio zmodyfikowano 2022-06-27 21:58
Autor Wiadomość
sushi2021
Temat założony przez niniejszego użytkownika
Błąd przy wyświetlania komunikatu o niepoprawnych danych logowania
» 2022-06-26 12:23:13
Witam. W kodzie programu poniżej wg. mnie jest gdzieś błąd lub coś robię źle. Chodzi o to, że wybieramy użytkownika z menu: 1 - admin, 2 - inny użytkownik, 3 - koniec. Następnie program prosi o wpisanie loginu i hasła. Do tego momentu jest wszystko dobrze. Problem pojawia się, gdy zatwierdzimy wprowadzone hasło. Program przyjmuje wprowadzone wartości jeśli są poprawne i wyświetla komunikat: "Przyznany dostep. Zalogowales sie za 1 razem", ale mimo tego wyświetla też błędny komunikat "Wprowadz poprawne dane logowania". Ten komunikat powinien się wyświetlić tylko w sytuacji, w której źle wprowadzimy login lub hasło. Komunikat o źle wprowadzonych danych logowania wyświetla się na obydwu użytkownikach. Jeżeli ktoś może pomóc w tej sytuacji, to będę bardzo wdzięczny.
C/C++
#include <iostream>
#include <fstream>  
//biblioteka odpowiedzialna za prace z plikami
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#include <cstdlib>

using namespace std;

int main()
{
   
string login;
   
int ilosc_prob_logowania = 0;
   
int wybor;
   
   
//menu z lista uzytkownikow
   
cout << endl;
   
cout << "-------- Wybierz uzytkownika --------" << endl;
   
cout << "1 - Admin " << endl;
   
cout << "2 - Inny uztkownik " << endl;
   
cout << "3 - Wyjscie" << endl;
   
cout << "-------------------------------------" << endl;
   
cout << endl;
   
cin >> wybor;
   
cin.ignore();
   
   
switch( wybor ) //menu wyboru
   
{
   
case 1:
       
cout << "Admin " << endl;
       
break;
   
case 2:
       
cout << "Inny uzytkownik " << endl;
       
break;
   
case 3:
       
exit( 0 );
       
break;
   
}
   
system( "pause" ); //zatrzymanie ekranu
   
system( "cls" ); //czyszczenie ekranu
   
cout << endl;
   
   
//wprowadzanie i wczytanie loginu uzytkownika
   
cout << "Wprowadz swoj login uzytkownika: " << endl;
   
cin >> login;
   
cin.ignore();
   
   
//ukrycie hasla pod gwiazdkami
   
constexpr char c_enter = 13;
   
constexpr char c_backspace = 8;
   
   
string passwd, passwd_2;
   
char input_character;
   
   
cout << "Podaj haslo: ";
   
input_character = _getch();
   
   
while( input_character != c_enter )
   
{
       
if( input_character == c_backspace && passwd.size() )
       
{
           
cout << "\b \b";
           
passwd.pop_back();
       
}
       
else if( input_character != c_backspace ) {
           
cout.put( '*' );
           
passwd += input_character;
       
}
       
       
if( input_character == c_backspace && passwd_2.size() ) {
           
cout << "\b \b";
           
passwd_2.pop_back();
       
}
       
else if( input_character != c_backspace ) {
           
cout.put( '*' );
           
passwd_2 += input_character;
       
}
       
       
input_character = _getch();
   
}
   
   
//cout << endl << "ukryty napis: " << passwd << endl; //widoczne haslo
   
cout << endl;
   
   
ilosc_prob_logowania++; //licznik prob logowan
   
string correctPasswd( "test" ); //przechowuje haslo uzytkownika -"admin"
   
string correctPasswd_2( "test2" ); // przechowuje haslo uzytkownika - "user"
   
   
if(( login == "admin" ) &&( passwd == correctPasswd ) ) //sprawdzanie poprawnosci loginu i hasla uzytkownika - "admin"
   
{
       
cout << "Przyznany dostep. " << endl;
       
cout << "Zalogowales sie za: " << ilosc_prob_logowania << " razem. " << endl;
       
cout << endl;
   
}
   
else
   
{
       
cout << "Wprowadz poprawne dane logowania." << endl;
   
}
   
   
if(( login == "user" ) &&( passwd == correctPasswd_2 ) ) //sprawdzanie poprawnosci loginu i hasla uzytkownika - "user"
   
{
       
cout << "Przyznany dostep. " << endl;
       
cout << "Zalogowales sie za: " << ilosc_prob_logowania << " razem. " << endl;
       
cout << endl;
   
}
   
else
   
{
       
cout << "Wprowadz poprawne dane logowania." << endl;
   
}
   
   
//zapis do pliku uzytkownika -"admin"
   
fstream plik_admin; //zmienna plikowa potrzebna dla kompilkatora
   
plik_admin.open( "log_admin.txt", ios::out ); //otwarcie pliku i zapis do niego, jezeli pliku nie bylo to zostanie stworzony
   
plik_admin << login << endl; //zapisz login
   
plik_admin << correctPasswd << endl; //zapisz pass
   
plik_admin.close(); //zamykanie otwrtego pliku
   
    //zapis do pliku uzytkownika -"user"
   
fstream plik_user; //zmienna plikowa potrzebna dla kompilkatora
   
plik_user.open( "log_user.txt", ios::out ); //otwarcie pliku i zapis do niego, jezeli pliku nie bylo to zostanie stworzony
   
plik_user << login << endl; //zapisz login
   
plik_user << correctPasswd_2 << endl; //zapisz pass
   
plik_user.close(); //zamykanie otwrtego pliku
   
   
   
system( "pause" );
   
return 0;
}

P-179569
pekfos
» 2022-06-26 13:05:31
Próbujesz się zalogować jako dwóch użytkowników naraz, co jest niemożliwe więc zawsze masz co najmniej jeden komunikat błędu.
P-179570
sushi2021
Temat założony przez niniejszego użytkownika
» 2022-06-27 18:50:58
Poprawiłem kod programu. Teraz przy wyborze "Administratora" loguje użytkownika "admin" i prosi o jego hasło. Przy wyborze "Inny uzytkownik" loguje jako "user" i prosi o jego hasło. Do tej pory program działa jak należy. Błąd powstaje przy obsłudze zapisu danych logowania jakiegokolwiek użytkownika. Program nie chce stworzyć plików: log_admin i log_user. W 1 pliku powinny znajdować się: login_admin, passwd_admin. W 2 pliku powinno być: login_user, passwd_user. Nic takiego się nie dziej. Proszę o pomoc w tej sytuacji. Program przy kompilacji nie "wyrzuca" żadnego błędu lub ostrzeżenia. Kod programu:
C/C++
// Midas.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu.
//

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <conio.h>
//#include <Windows.h>
//#include <cstdio>
//#include <string>
//#include <cstdlib>


using namespace std;

int main()
{
   
cout << "******************** Ussers: ******************** " << endl;
   
cout << "********** 1 - Administrator ******************** " << endl;
   
cout << "********** 2 - Inny uzytkownik ****************** " << endl;
   
cout << "********** 3 - Exit ***************************** " << endl;
   
cout << "************************************************* " << endl;
   
cout << endl;
   
   
string login_admin = "admin", login_user = "user";
   
string passwd_admin, passwd_user;
   
string correct_passwd_admin = "test", correct_passwd_user = "pass";
   
   
int ilosc_logowan = 0;
   
int menu;
   
cin >> menu;
   
   
ilosc_logowan++; //licznik logowan
   
    //ukrycie hasla pod gwiazdkami
   
constexpr char c_enter = 13;
   
constexpr char c_backspace = 8;
   
   
char input_character;
   
   
if(( login_admin == "admin" ) ||( login_user == "user" ) )
   
{
       
cout << "Podaj haslo: " << endl;
   
}
   
   
input_character = _getch();
   
   
while( input_character != c_enter )
   
{
       
       
if( input_character == c_backspace && correct_passwd_admin.size() || correct_passwd_user.size() )
       
{
           
cout << "\b \b";
           
correct_passwd_admin.pop_back();
           
correct_passwd_user.pop_back();
       
}
       
else if( input_character != c_backspace )
       
{
           
cout.put( '*' );
           
correct_passwd_admin += input_character;
           
correct_passwd_user += input_character;
       
}
       
       
input_character = _getch();
   
}
   
   
switch( menu )
   
{
   
case 1:
       
{
           
cout << "Podaj login administratora: " << endl;
           
cin >> login_admin;
           
//cout << "Podaj haslo administratora: " << endl;
            //cin >> passwd_admin;
           
           
if(( login_admin == "admin" ) &&( passwd_admin == correct_passwd_admin ) ) //sprawdzanie poprawnosci loginu i hasla uzytkownika - "admin"
           
{
               
cout << endl;
               
cout << "Przyznany dostep. " << endl;
               
cout << "Zalogowales sie za: " << ilosc_logowan << " razem. " << endl;
               
cout << endl;
               
exit( 0 );
           
}
           
else
           
{
               
cout << endl;
               
cout << "Wprowadz poprawne dane logowania uzytkownika: Administrator." << endl;
               
exit( 0 );
           
}
           
           
//zapis do pliku uzytkownika -"admin"
           
fstream plik_admin; //zmienna plikowa potrzebna dla kompilkatora
           
plik_admin.open( "log_admin.txt", ios::out | ios::app ); //otwarcie pliku i zapis do niego, jezeli pliku nie bylo to zostanie stworzony
           
plik_admin << login_admin << endl; //zapisz login
           
plik_admin << passwd_admin << endl; //zapisz pass
           
plik_admin.close(); //zamykanie otwrtego pliku  
           
exit( 0 );
           
break;
       
}
   
case 2:
       
{
           
cout << "Podaj login uzytkownika: " << endl;
           
cin >> login_user;
           
//cout << "Podaj haslo uzytkownika: " << endl;
            //cin >> passwd_user;
           
           
if(( login_user == "user" ) &&( passwd_user == correct_passwd_user ) ) //sprawdzanie poprawnosci loginu i hasla uzytkownika - "user"
           
{
               
cout << endl;
               
cout << "Przyznany dostep. " << endl;
               
cout << "Zalogowales sie za: " << ilosc_logowan << " razem. " << endl;
               
cout << endl;
               
exit( 0 );
           
}
           
else
           
{
               
cout << endl;
               
cout << "Wprowadz poprawne dane logowania: Inny uzytkownik. " << endl;
               
exit( 0 );
           
}
           
           
//zapis do pliku uzytkownika -"user"
           
fstream plik_user; //zmienna plikowa potrzebna dla kompilkatora
           
plik_user.open( "log_user.txt", ios::out | ios::app ); //otwarcie pliku i zapis do niego, jezeli pliku nie bylo to zostanie stworzony
           
plik_user << login_user << endl; //zapisz login
           
plik_user << passwd_user << endl; //zapisz pass
           
plik_user.close(); //zamykanie otwrtego pliku
           
exit( 0 );
           
break;
       
}
   
case 3:
       
{
           
cout << "Exit " << endl;
           
exit( 0 );
           
break;
       
}
       
default:
       
{
           
cout << "Nie ma takiej opcji wyboru. " << endl;
           
exit( 0 );
           
break;
       
}
    }
   
   
system( "pause" );
   
return 9;
}
P-179571
pekfos
» 2022-06-27 20:03:14
Przez te wszystkie exit() nigdy nie dochodzisz do punktu w którym tworzysz plik.

Do tej pory program działa jak należy.
Przechodzi dowolne hasło parzystej długości, nie krótsze niż 4 znaki.
P-179572
sushi2021
Temat założony przez niniejszego użytkownika
» 2022-06-27 20:45:48
Po usunięciu wszystkich " exit(0) " program tworzy pliki do zapisu. Zapisuje w nich tylko nazwę użytkownika. Nie chce zapisać wprowadzonego hasła. W jaki sposób należy poprawić program aby do plików dopisywał również hasło ? Co należy zrobić, aby akceptował tylko prawidłowe hasło (zapisane), a nie dowolne nie krótsze niż 4 znaki. Dzięki za pomoc.
P-179573
pekfos
» 2022-06-27 21:16:47
Wystarczy Ctrl+F na nazwie zmiennej i przejrzenie wszystkich użyć by dojść czemu nie masz hasła w pliku. Okaż chociaż minimum własnej pracy.
P-179574
sushi2021
Temat założony przez niniejszego użytkownika
» 2022-06-27 21:41:11
Dla Ciebie jest to prawdopodobnie oczywiste. Dla kogoś, kto z C++ ma styczność około tygodnia niespecjalnie to wszystko jest wyraziste. Wiem, że gdzieś jest błąd skoro nie chce zapisać hasła do pliku. Ale tego nie widzę. Funkcję zapisu danych logowania do pliku przerabiałem z kursu M. Zelenta. Zrobiłem tak jak było tam tłumaczone. Czyli wg. M. Zelenta było tak:
C/C++
fstream plik;
plik.open( "wizytowka.txt", ios::out | ios::app );

plik << imie << endl;
plik << nazwisko << endl;
plik << nr_tel << endl;

plik.close();

W moim projekcie jest następująca treśc:
C/C++
fstream plik_admin; //zmienna plikowa potrzebna dla kompilkatora
plik_admin.open( "log_admin.txt", ios::out | ios::app ); //otwarcie pliku i zapis do niego, jezeli pliku nie bylo to zostanie stworzony
plik_admin << login_admin << endl; //zapisz login
plik_admin << passwd_admin << endl; //zapisz pass
plik_admin.close(); //zamykanie otwrtego pliku

Różnica między nimi jest tylko taka, że wprowadzane są różne dane i inne są nazwy plików. Poza tym wszystko jest takie same. Dlatego nie rozumiem gdzie popełniłem błąd.
P-179575
pekfos
» 2022-06-27 21:58:22
Problemy które masz do tej pory można zdiagnozować prostymi badaniami. Jeśli masz zapisane coś w programie i nie widać efektów, to albo
a) ten kod się w ogóle nie wykonuje, co można sprawdzić dodając obok:
C/C++
std::cout << "JESTEM!\n";
b) wykonuje się, ale nie robi tego co oczekujesz, co można sprawdzić dodając
C/C++
std::cout << "Zapisuje do pliku: " << zmienna << "\n";
W tym wypadku było "a" i "b". Dałem podpowiedź by wyszukać wystąpienia zmiennej. To wszystkie użycia passwd_user:
C/C++
string passwd_admin, passwd_user;
//...
if(( login_user == "user" ) &&( passwd_user == correct_passwd_user ) )
{
   
//..
}
plik_user << passwd_user << endl; //zapisz pass
Skąd hasło się ma wziąć? Nic nigdy nie modyfikuje zmiennej którą chcesz zapisać do pliku. Hasło wczytujesz do correct_passwd_user, chociaż tam właśnie trzymasz poprawne hasło. Jedyny sposób na zalogowanie się to wprowadzenie w jakiś sposób pustego hasła, albo przez wprowadzanie backspace, albo wykorzystując błędy w implementacji wczytywania hasła - wspomniane hasło parzystej długości etc.
P-179576
« 1 »
  Strona 1 z 1