Авторизация в с++

263
25 декабря 2017, 13:25

Всем привет,как сверить ведённый логин и пароль уже с хранимшемся в файле? Я в функции void (main) сделал выбор,что при запуске программы выбор: 1- войти , 2- выйти Когда нажимаешь на 1 , то перекидывает на функцию login () В функции login я е запрашиваю логин и пароль, но тут у меня сразу возникет вопрос, в какие переменные мне считывать логин и пароль ? и как мне их сверить?

struct Account  {
    string login;
    string password;
    int role; //0-студент ,1 -админ
};
void GlavnoeMenu();
void login();
void MenuAccounts();
void writeFileAccounts(Account *arr_of_accounts, int number_of_accounts); 
void writeEndFileAccounts(Account new_account );
void readFileAccounts(Account *arr_of_accounts, int &number_of_accounts);
void showAccounts(Account *arr_of_accounts, int number_of_accounts);
void addAccount(Account *arr_of_accounts, int &number_of_accounts);
void delAccount(Account *arr_of_accounts, int &number_of_accounts);
void updateAccount(Account *arr_of_accounts, int number_of_accounts);
const int SIZE_ARR_OF_ACCOUNTS = 100; //константа для размера нашего массива в  100 элементов
const string FILE_OF_ACCOUNTS = "Accounts.txt";// ПУТЬ К ФАЙЛУ
void main()
{
    setlocale(LC_ALL, "rus");
    Account arr_of_accounts[SIZE_ARR_OF_ACCOUNTS]; //создаём массив для структуры состоящей из 100 элементов
    int number_of_accounts = 0;// ?
    readFileAccounts(arr_of_accounts, number_of_accounts);//чтение из файла в массив , берём наш массив и номер аккаунта
    bool flag_exit = true;
    while (flag_exit) //пока flag_exit  равен правда,то
    {
        //MenuAccounts(); // для отображения пунктов выбора меню
        GlavnoeMenu();
        int item; //item - переменная для выбора пункта меню
        cin >> item; //просим ввести пункт выбора меню
        switch (item)
        {
        case 1:login();
            break;
        case 2:flag_exit = false;
            break;
        }
    }
    writeFileAccounts(arr_of_accounts, number_of_accounts);
        system("pause");
}
void GlavnoeMenu(){
    cout << "Авторизация" << endl;
    cout << "1: войти" << endl;
    cout << "2: выход" << endl;
}

void login(){
    cout << "Введите ваш логин " << endl;
    cin >> 
    cout << "Введите ваш пароль" << endl;
    cin >> 
}
void MenuAccounts(){
    cout << "Меню для работы с учётными записями пользователей"<<endl;
    cout << "1: показать" << endl;
    cout << "2: добавить" << endl;
    cout << "3: удалить" << endl;
    cout << "4: редактировать" << endl;
    cout << "0: выход"<< endl;
}
void readFileAccounts(Account *arr_of_accounts, int &number_of_accounts)  
{
    ifstream fin(FILE_OF_ACCOUNTS, ios::in);//открыли файл для чтения
    if (!fin.is_open())
    {
        arr_of_accounts[0].login = "admin";
        arr_of_accounts[0].password = "admin";
        arr_of_accounts[0].role = 1;
        number_of_accounts = 1;
        writeEndFileAccounts(arr_of_accounts[0]);
    }
    else
    {
        number_of_accounts = 0;
        while (!fin.eof())
        {
            fin >> arr_of_accounts[number_of_accounts].login >> arr_of_accounts[number_of_accounts].password >> arr_of_accounts[number_of_accounts].role;
            number_of_accounts++;
        }
    }
    fin.close();// закрыли открытый файл
}
void writeFileAccounts(Account *arr_of_accounts, int number_of_accounts)
{
    ofstream fout(FILE_OF_ACCOUNTS, ios::out);// Открыли файл для записи
    for (int i = 0; i < number_of_accounts; i++)
    {
        if (i < number_of_accounts - 1)
            fout << arr_of_accounts[i].login << " " << arr_of_accounts[i].password << " " << arr_of_accounts[i].role << endl;
        else
            fout << arr_of_accounts[i].login << " " << arr_of_accounts[i].password << " " << arr_of_accounts[i].role;
    }
    fout.close();
}
void writeEndFileAccounts(Account new_account)
{
    ofstream fout(FILE_OF_ACCOUNTS, ios::app);//открыли файл для дозаписи
    fout << endl;
    fout << new_account.login << " " << new_account.password << " " << new_account.role;
    fout.close();
}
void showAccounts(Account *arr_of_accounts, int number_of_acounts)
{
    cout << "Таблица учётных записей пользователей "<<endl;
    for (int i = 0; i < number_of_acounts; i++)
        cout << setw(4) << left << i + 1 <<
        setw(15) << left << arr_of_accounts[i].login <<
        setw(15) << left << arr_of_accounts[i].password <<
        setw(15) << left << arr_of_accounts[i].role << endl;
}
void addAccount(Account *arr_of_accounts, int &number_of_accounts)
{
    number_of_accounts++;
    cout << "Введите данные новой учётки" <<endl;
    cout << "Логин ";
    cin >> arr_of_accounts[number_of_accounts - 1].login;
    cout << "пароль ";
    cin >> arr_of_accounts[number_of_accounts - 1].password;
    cout << "Роль ";
    cin >> arr_of_accounts[number_of_accounts - 1].role;
    system("cls");
        cout << "Новая учётка добавлена !" << endl;
    cout << endl;
}
void delAccount(Account *arr_of_accounts, int &number_of_accounts)
{
    cout << "Введите номер удаляемой записи ";
    int del_item;
    cin >> del_item;
    for (int i = del_item - 1; i < number_of_accounts; i++)
        arr_of_accounts[i] = arr_of_accounts[i + 1];
    number_of_accounts--;
    system("cls");
    cout << "запись удалена !" << endl;
    cout << endl;
}
void updateAccount(Account *arr_of_accounts, int number_of_accounts)
{
    cout << "Введите номер редактируемой записи ";
    int upd_item;
    cin >> upd_item;
    cout << "отредактируейте данные учётной записи: "<<endl;
    cout << "логин:  !";
    cin>>arr_of_accounts[upd_item - 1].login;
    cout << "Пароль:  !";
    cin >> arr_of_accounts[upd_item - 1].password;
    cout << "роль:  !";
    cin >> arr_of_accounts[upd_item - 1].role;
        system("cls");
    cout << "запись отредактирована !" << endl;
    cout << endl;
}
Answer 1

А куда происходит ввод в void login()? Если проблема с чтением в std::string, которыми кстати у вас являются поля логина и пароля в структуре Account, то это делается так:

std::string input;
std::getline(std::cin, input);

Ну а сравнение std::string делается через обычный оператор "=="...
Читается и парсится файл с аккаунтами, в функции авторизации читаете в первый буфер ввода логин, если нашли его в своём файле, читаете дальше пароль и сверяете с тем, что соответствует этому логину в файле. Ну а если есть оба соответствия, разрешаете дальнейшие пункты меню.

READ ALSO
Ошибка при инициализации vector&lt;string&gt;

Ошибка при инициализации vector<string>

Добрый день! Я студент технического вуза и самостоятельно пытаюсь выучить c++Что пытаюсь сделать :

254
Как изменить текст элемента управления static?

Как изменить текст элемента управления static?

Сначала получал дескриптор статика и использовал setwindowtext, но почему-то не робит

206
Надо ли писать два двоеточия перед std?

Надо ли писать два двоеточия перед std?

Некоторые авторы используют два двоеточия ("::") перед неймспейсом std, например:

231
Прочитать полностью wchar_t с памяти

Прочитать полностью wchar_t с памяти

Autoit работает хорошо, но c++ читает первый символ, как быть?

218