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. #include <iostream> #include <fstream> #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; 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 ) { case 1: cout << "Admin " << endl; break; case 2: cout << "Inny uzytkownik " << endl; break; case 3: exit( 0 ); break; } system( "pause" ); system( "cls" ); cout << endl; cout << "Wprowadz swoj login uzytkownika: " << endl; cin >> login; cin.ignore(); 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; ilosc_prob_logowania++; string correctPasswd( "test" ); string correctPasswd_2( "test2" ); if(( login == "admin" ) &&( passwd == correctPasswd ) ) { 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 ) ) { cout << "Przyznany dostep. " << endl; cout << "Zalogowales sie za: " << ilosc_prob_logowania << " razem. " << endl; cout << endl; } else { cout << "Wprowadz poprawne dane logowania." << endl; } fstream plik_admin; plik_admin.open( "log_admin.txt", ios::out ); plik_admin << login << endl; plik_admin << correctPasswd << endl; plik_admin.close(); fstream plik_user; plik_user.open( "log_user.txt", ios::out ); plik_user << login << endl; plik_user << correctPasswd_2 << endl; plik_user.close(); system( "pause" ); return 0; }
|
|
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. |
|
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: #include <iostream> #include <cstdlib> #include <fstream> #include <conio.h> 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++; 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; if(( login_admin == "admin" ) &&( passwd_admin == correct_passwd_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 ); } fstream plik_admin; plik_admin.open( "log_admin.txt", ios::out | ios::app ); plik_admin << login_admin << endl; plik_admin << passwd_admin << endl; plik_admin.close(); exit( 0 ); break; } case 2: { cout << "Podaj login uzytkownika: " << endl; cin >> login_user; if(( login_user == "user" ) &&( passwd_user == correct_passwd_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 ); } fstream plik_user; plik_user.open( "log_user.txt", ios::out | ios::app ); plik_user << login_user << endl; plik_user << passwd_user << endl; plik_user.close(); 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; }
|
|
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. |
|
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. |
|
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. |
|
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: 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: fstream plik_admin; plik_admin.open( "log_admin.txt", ios::out | ios::app ); plik_admin << login_admin << endl; plik_admin << passwd_admin << endl; plik_admin.close(); 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. |
|
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: std::cout << "JESTEM!\n";
b) wykonuje się, ale nie robi tego co oczekujesz, co można sprawdzić dodają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: string passwd_admin, passwd_user; if(( login_user == "user" ) &&( passwd_user == correct_passwd_user ) ) { } plik_user << passwd_user << endl; 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. |
|
« 1 » |