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

Program do logowania. Pomoc

Object Storage Arubacloud
–1 głos
238 wizyt
pytanie zadane 19 lutego 2018 w C i C++ przez FaloY Bywalec (2,180 p.)

Witam, mam problem z moim programem do logowania. Otóż mam kod, który odczytuje dane linijki z .txt

void sprawdz_login()
{
	ifstream file("C:\\Users\\HP\\AppData\\Local\\LaP\\information.txt");
	const int lineNumber = 2;
	string line;
	for(int i = 0; i < lineNumber - 1; ++i)
	{
		getline(file, line);
		if (line == login)
		{
			cout << "Login poprawny!" << endl;
		}
		else
		{
			cout << "Login nie poprawny!" << endl;
			exit(1);
		}
	}
	cin.clear();
}

void sprawdz_haslo()
{
	ifstream file("C:\\Users\\HP\\AppData\\Local\\LaP\\information.txt");
	const int lineNumber = 3;
	string line;
	for(int i = 0; i < lineNumber - 1; i++)
	{
		getline(file, line);
		if (line == password)
		{
			cout << "haslo poprawne!" << endl;
		}
		else
		{
			cout << "Haslo niepoprawne!" << endl;
			exit(1);
		}
	}
	getline(file, line);
	cout << "Haslo " << line << endl;
}

jak wpisuje LOGIN to mi go akceptuje, jednak jak wpisuje HASŁO to jest poprawna odczytana linia, ale hasło jest takie jak login, wie może ktoś gdzie jest błąd w tym kodzie? ps. Jeżeli coś jest nie zrozumiałe to proszę napisać! Dzieki! ;D 

1
komentarz 19 lutego 2018 przez Secrus Nałogowiec (32,880 p.)
Pokaż w jaki sposób masz skonstruowany plik z loginem i haslem. Poza tym, skad bierzesz zmienne login i password?
komentarz 20 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
Prawdopodobnie źle czytasz plik. Jeśli jednak nawet nie zdradziłeś jak wygląda... zgadywać? Nie lepiej trzymać login i skrót hasła w 1 linii oddzielone separatorem (np jak u mnie spacją) ?

Inną sprawą jest łamanie zasady pojedynczej odpowiedzialności. Jeśli funkcja ma coś sprawdzić, nie powinna wczytywać danych, parsować, porównywać, raportować na konsolę. Zwróć true/false z informacją czy hasło poprawne.
komentarz 20 lutego 2018 przez FaloY Bywalec (2,180 p.)
void sprawdz_login()
{
	ifstream file("C:\\Users\\HP\\AppData\\Local\\LaP\\information.txt");
	bool oyl = false;
	const int lineNumber = 1;
	string line;
	for(int i = 0; i < lineNumber; ++i)
	{
		getline(file, line);
		if (line == login)
		{
			cout << "Login poprawny!" << endl;
			oyl = true;
		}
	}
	if (!oyl)
	{
		cout << "Nie porpawny login!" << endl;
		exit(1);
	}	
}

void sprawdz_haslo()
{
	ifstream file("C:\\Users\\HP\\AppData\\Local\\LaP\\information.txt");
	bool oyh = false;
	const int lineNumber = 2;
	string line;
	for(int i = 0; i < lineNumber - 1; i++)
	{
		getline(file, line);
		if (line == password)
		{
			cout << "haslo poprawne!" << endl;
			oyh = true;
		}
	}
	if(!oyh)
	{
		cout << "Nie poprwane haslo!" << endl;
		exit(1);
	}
}

Hmm, dużo osób już pisało mi o tym 

bool

więc dodałem, jednak to mojego problemu nie rozwiązuje ;\

2 odpowiedzi

0 głosów
odpowiedź 19 lutego 2018 przez mokrowski Mędrzec (155,460 p.)

Wiesz co, masz tu taki bałagan że nie wiem (nie znając formatu pliku) co można podpowiedzieć. Dlaczego funkcje sprawdz_* nie zwracają bool? Co to "za-niefajny" pomysł by hasło trzymać otwartym tekstem i porównywać?

Wyciąłem coś z małego programu który kiedyś pisałem. Szyfrowanie? Bardzo słabe bo funkcja skrótu z biblioteki standardowej ale już lepiej niż otwarty tekst. Do testów anty-wzorzec haseł, hasło jest takie jak login.

Plik z loginem i hasłem:

adam 2624505284893637006
tomek 13428271459780201113

Sam szkic programu. Usuń komentarz na sekcji którą chcesz wywołać:

#include <iostream>
#include <string>
#include <functional>
#include <fstream>
#include <utility>
#include <unordered_map>

constexpr static const char * fileName = "/tmp/passwds";

std::unordered_map<std::string, size_t> readFile(const std::string& fileName) {
    std::unordered_map<std::string, size_t> result;
    std::string login;
    size_t passHash;
    std::ifstream file(fileName);
    // TODO: Sprawdzenie poprawności otwarcia itp...
    while(file >> login >> passHash) {
        result[login] = passHash;
    }
    return result;
}

void saveFile(const std::unordered_map<std::string, size_t>& loginMap, const std::string& fileName) {
    std::ofstream file(fileName);
    // TODO: Sprawdzenie poprawności otwarcia itp...
    for(const auto& pr: loginMap) {
        file << pr.first << ' ' << pr.second << std::endl;
    }
}

std::pair<std::string, size_t> readLoginPass() {
    std::string login;
    std::string pass;
    std::cout << "Podaj login: ";
    std::cin >> login;
    // TODO: Sprawdzenie poprawności itp...
    std::cout << "Podaj hasło: ";
    std::cin >> pass;
    // TODO: Sprawdzenie poprawności itp...
    return std::pair<std::string, size_t>(login, std::hash<std::string>()(pass));
}

bool checkPasswd(const std::unordered_map<std::string, size_t>& passMap, const std::pair<std::string, size_t>& pr) {
    auto it = passMap.find(pr.first);
    if(it != passMap.end()) {
        // Znaleziono login... 
        return it->second == pr.second;
    }
    return false;
}

int main() {
    auto passMap = readFile(fileName);

    // Odkomentuj jedną z sekcji... 
    
    // Dodawanie nowych kont... 
    /*    
    auto pr = readLoginPass();
    passMap[pr.first] = pr.second;
    saveFile(passMap, fileName);
    */
   

    // Weryfikacja poprawności hasła
    /*
    auto pr = readLoginPass();
    std::cout << "Hasło " << (checkPasswd(passMap, pr) ? "jest": "nie jest") << " prawidłowe.\n";
    */
}

 

komentarz 20 lutego 2018 przez FaloY Bywalec (2,180 p.)
Nadal nie rozumiem popełnianego przez ze mnie błędu...
–3 głosów
odpowiedź 19 lutego 2018 przez FaloY Bywalec (2,180 p.)

1. Pokaż w jaki sposób masz skonstruowany plik z loginem i haslem. ??

 2. To jest tylko kawałek tego kodu, nie wklejałem całości.

Podobne pytania

–1 głos
1 odpowiedź 176 wizyt
pytanie zadane 22 maja 2020 w C# przez zdridox Nowicjusz (210 p.)
0 głosów
0 odpowiedzi 77 wizyt
pytanie zadane 22 marca 2020 w C i C++ przez nyaxyt101 Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 192 wizyt
pytanie zadane 15 września 2018 w Urządzenia mobilne przez kashorii Nowicjusz (120 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...