Cześć, od niedawna uczę się C++ i wymyśliłem sobie takie zadanie, żeby napisać program, który przy wpisywaniu hasła zakrywa je i zamienia na "*". Nic wielkiego, nie jest to też jakoś bardzo praktyczne - zwykłe ćwiczenie i ciekawość. Znalazłem fajny kod pod WindowsAPI i coś tam skleiłem. Jednak ten kod czyta hasło ze statycznego chara "const char *correct_password = hasło" - czyli hasło trzeba wpisać. Teraz sobie pomyślałem, że fajnie by było gdyby program najpierw pytał o rejestrację, czyli np. wypluwał dwie opcje: 1. rejestracja, 2. login (zwykły cout). W punkcie 1. pytałby o login i hasło - bez zakrywania inputu, czyli pewnie cin, po czym zapisywał dane do pliku .txt. Później loopowałby do początku i przy wyborze opcji 2. login, wpisywałoby się login i hasło - już z zakrytym inputem, tak jak w kodzie programu, i wtedy program czytałby z pliku .txt (pewnie jakiś fstream) czy użytkownik faktycznie jest zarejestrowany i sprawdziłby poprawność danych (if). Próbowałem wielu opcji i w żaden sposób nie mogę tego ogarnąć - kod zakrywania inputu hasła, który wklejam pod spodem, jest za trudny i nie za bardzo wiem jak ugryźć zapisywanie zakrytego chara do pliku a potem sprawdzanie go. Kombinowałem żeby w stringu getpass password == jakiś_inny_string i potem żeby zapisywał go do pliku, ale nic z tego. Macie może jakieś pomysły? A może trzeba przepisać w inny sposób zakrywanie inputu? Chodzi mi konkretnie żeby po "rejestracji" input był zakryty gwiazdkami "*" i jednocześnie sprawdzał z danymi w pliku .txt. Fajnie jeśli ktoś rzuci jakieś pomysły. Próbowałem pytać na stackoverflow, ale tam mnie minusowali - nie wiem po co, jestem początkującym koderem, który nigdy nie programował - na co dzień siedzę w elektronice/ naprawach hardware'u i pomyślałem, że fajnie by było się pouczyć C++, tak hobbystycznie. Pod spodem wklejam kod zakrywania inputu hasła, nic więcej nie mam. Szczęśliwego Nowego Roku, tak w ogóle :)
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
string getpass(const char *dat, bool s_asterisk=true)
{
const char BACKSPACE=8;
const char RETURN=13;
string password;
unsigned char ch=0;
cout << dat;
DWORD con_mode;
DWORD dwRead;
HANDLE hIn=GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode( hIn, &con_mode );
SetConsoleMode( hIn, con_mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT) );
while(ReadConsoleA( hIn, &ch, 1, &dwRead, NULL) && ch !=RETURN)
{
if(ch==BACKSPACE)
{
if(password.length()!=0)
{
if(s_asterisk)
cout <<"\b \b";
password.resize(password.length()-1);
}
}
else
{
password+=ch;
if(s_asterisk)
cout <<'*';
}
}
cout << endl;
return password;
}
int main()
{
const char *correct_password="fdsidfjsijdsf21128321873";
START:
string password=getpass("Enter the password: ",true);
if(password==correct_password){
cout <<"\nCorrect password."<<endl;
exit(1);
}else{
cout <<"\nIncorrect password. Try again.\n"<<endl;
goto START;
}
return 0;
}