Проверить введенные данные пользователя с данными из файла

257
30 сентября 2017, 22:52

Не знаю как проверить веденные данные пользователя что бы сравнились с строками из файла. Проблема заключается в одной функции GetIntoTheSystem. проверяет только одну строчку, что нужно дописать-переписать что бы проверялась не только первая строчка файла.

#include <iostream>
#include <string>
#include <fstream>
#include <cstdio>
using namespace std;
void EnterFild(string &, string &);
void DisplayMenu();
void AdminMenu();
void Registration();
void GetIntoTheSystem(string, string);
int main() {
 string userlogin;
 string userpassword;
 DisplayMenu();
 GetIntoTheSystem(userlogin, userpassword);
 return 0;
 }
 void EnterFild(string &userlogin, string &userpassword) {
 cout << "Enter the login: ";
 cin >> userlogin;
cout << "Enter the password: ";
cin >> userpassword;
  }
void Registration() {
  string userlogin, userpassword;
   EnterFild(userlogin, userpassword);
   ofstream outFile;
   outFile.open("program.txt", ios_base::app);
   outFile << userlogin << " " << userpassword << endl;
   outFile.close();
   cout << "\n\n";
  }
void AdminMenu() {
   ifstream insidFile("program.txt", ios_base::in);
   string line;
if (insidFile.is_open()) {
    int qtyuser = 1;
    while (!insidFile.eof()) {
        getline(insidFile, line);
        cout << "\t#" << qtyuser++ << ": " << line << endl;
    }
}
else {
    cerr << "Error, couldn't be opened the file." << endl;
    exit(EXIT_FAILURE);
  }
  }
  void GetIntoTheSystem(string userlogin, string userpassword) {
ifstream isUserloginTrue("program.txt", ios_base::in);
string  line; int verify;
string  loginAdministrator = "Admin",
    passwordAdministrator = "Admin";
EnterFild(userlogin, userpassword);
if (isUserloginTrue.is_open()) {
    while (!isUserloginTrue.eof()) {
        getline(isUserloginTrue, line);
        if (line == userlogin + " " + userpassword) {
            cout << "WELCOME, " << userlogin << endl;
            break;
        }
        else if (userlogin == loginAdministrator && userpassword == passwordAdministrator) {
            cout << "You have been enter as administrator!" << endl;
            cout << " - DISPLAY USERS: " << endl;
            AdminMenu();
            break;
        }
        else {
            for (int verify = 0; verify < 3; verify++) {
                cout << "\nUncorrect login or password.\n\tAttempts to enter left " << 3 - verify << endl;
                EnterFild(userlogin, userpassword);
                if (line == userlogin + " " + userpassword) {
                    cout << "WELCOME, " << userlogin << endl;
                }
                else if (userlogin == loginAdministrator && userpassword == passwordAdministrator) {
                    cout << "You have been enter as administrator!" << endl;
                    cout << " - DISPLAY USERS: " << endl;
                    AdminMenu();
                    break;
                }
                else {
                    if (verify == 2) {
                        cout << "\n\nAccess denied!The number of attempts is limited!\n\n\n" << endl;
                        exit(EXIT_SUCCESS);
                    }
                }
            }
        }
    }
}
else {
    cerr << "Error, couldn't be opened the file." << endl;
    exit(EXIT_FAILURE);
}
}
void DisplayMenu() {
  string userlogin, userpassword;
  int command = 0;
do {
    cout << "1. Log in system" << endl;
    cout << "2. Registration" << endl;
    cout << "3. Exit" << endl;
    cout << "\tPlease select your option(1-3): ";
    cin >> command;
    switch (command) {
    case 1: GetIntoTheSystem(userlogin, userpassword); break;
    case 2: Registration(); break;
    case 3: exit(EXIT_SUCCESS); break;
    }
  } while (command != 3);
}
Answer 1

У вас там серьезная проблема с алгоритмом, который реализован в функции GetIntoTheSystem. Вы смешали в одну большую кучу следующие вещи:

  1. Предоставление пользователю нескольких попыток ввода;
  2. Проверку введенных пользователем данных на наличие в файле паролей;
  3. Проверку, не является ли пользователь администратором.

Причем, смешали неправильно. Все очень запутанно, местами нет необходимых break и т.д.

Работоспособная схема могла бы выглядеть так:

for(...) // цикл по попыткам ввода
{
    Ввести данные от пользователя;
    if(введенные данные соответствуют данным администратора)
    {
        Залогинить пользователя как администратора;
        return;    
    }
    else
    {
        Открыть файл паролей;
        while(файл паролей не закончился)
        {
            Считать строку
            if(строка соответствует введенным пользователем данным)
            {
                залогинить пользователя как обычного пользователя
                return;
            }
        }
        Закрыть файл паролей
        Вывести сообщение о неудаче авторизации.
    }
}
Вывести сообщение об исчерпании числа попыток авторизации.

Отмечу также, что предложенная схема лишь представляет собой минимальную модификацию вашего кода, чтобы он работал так, как вы ожидаете. И она не является идеальной ни с алгоритмической точки зрения (чтение файла каждый раз, последовательный поиск в нем), ни с точки зрения защиты информации (пароли в открытом виде в файле, ну вы поняли...).

И вообще, в предоставленном вами коде масса проблем с многих точек зрения. Но ладно. Тратить на это время не имеет смысла, пока вы не научитесь составлять работоспособные алгоритмы.

READ ALSO
Не удается инициализировать ссылку

Не удается инициализировать ссылку

VS пишет что не может инициализировать ссылки (&char, &string) и подчеркивает fun(s1[1], s1);

250
Стоит ли ставить MingW для : C/C++? [требует правки]

Стоит ли ставить MingW для : C/C++? [требует правки]

ЗдравствуйтеЯ думаю поставить компилятор MingW для SublimeText 3, вот ихний сайт: "http://mingw

226
Как передать двумерный vector в метод класса?

Как передать двумерный vector в метод класса?

Добрый день, вот есть у меня двумерный вектор vector< vector<int> > arr Как мне его параметром передать в метод?

293