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

Program do logowania. Pomoc

–1 głos
135 wizyt
pytanie zadane 19 lutego 2018 w C i C++ przez FaloY Obywatel (1,140 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,460 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 VIP (108,160 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 Obywatel (1,140 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 VIP (108,160 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 Obywatel (1,140 p.)
Nadal nie rozumiem popełnianego przez ze mnie błędu...
–3 głosów
odpowiedź 19 lutego 2018 przez FaloY Obywatel (1,140 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

0 głosów
2 odpowiedzi 82 wizyt
pytanie zadane 15 września 2018 w Telefony i tablety przez kashorii Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 117 wizyt
pytanie zadane 11 marca 2018 w HTML i CSS przez pebrzosky Obywatel (1,170 p.)
+1 głos
2 odpowiedzi 102 wizyt
pytanie zadane 7 stycznia 2016 w Python, Django przez Devero Początkujący (300 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

64,959 zapytań

111,437 odpowiedzi

234,530 komentarzy

46,789 pasjonatów

Przeglądających: 125
Pasjonatów: 1 Gości: 124

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...