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";
*/
}