С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
8 / 8 / 4
Регистрация: 08.12.2022
Сообщений: 157

Система авторизации и входа

11.03.2024, 13:34. Показов 545. Ответов 12
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу понять, как сделать что бы время последнего входа перезаписывалось, а не вносилось в файл в новой строке.Подскажите умные люди)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <regex>
#include <ctype.h>
#include <chrono>
 
// Макрос для пути к файлу
#define FILE "D:\InfoUsers.txt"
 
using namespace std;
 
// Структура для хранения данных пользователя
struct Users
{
    string email = ""s;
    string login = ""s;
    string password = ""s;
    string registration_time = ""s;
    string entry_time = ""s;
};
 
//Функция проверки корректности почты
bool IsValidEmail(const string& email)
{
    regex emailRegex("([a-zA-Z0-9]+)(\\.[a-zA-Z0-9]+)*@([a-zA-Z0-9]+)(\\.[a-zA-Z0-9]+)*");
    return regex_match(email, emailRegex);
}
 
//Функция проверки соответствия пароля заданным требованиям
bool IsValidPassword(const string& password)
{
    bool has_special_char = false;
    bool has_upper_case = false;
    bool has_lower_case = false;
 
    if (password.length() < 10)
    {
        return false;
    }
 
    for (char c : password)
    {
        if (!isalnum(c))
        {
            has_special_char = true;
        }
        if (isupper(c))
        {
            has_upper_case = true;
        }
        if (islower(c))
        {
            has_lower_case = true;
        }
    }
    return has_special_char && has_upper_case && has_lower_case;
}
 
//Функция для получения текущей даты и времени
string GetCurrentTime()
{
    std::chrono::zoned_time now{ std::chrono::current_zone(), std::chrono::system_clock::now() };
 
    ostringstream oss;
    oss << format("{:%d.%m.%Y %H:%M}", now.get_local_time());
    string nowString = oss.str();
 
    return nowString;
}
 
// Функция для добавления нового пользователя
Users AddCustomer()
{
    string login = ""s;
    cout << "Enter your login : ";
    getline(cin, login);
    cin.ignore();
 
    string email = ""s;
    do
    {
        cout << "Enter your email : "s;
        getline(cin, email);
        cin.ignore();
    } while (!IsValidEmail(email));
 
    string password = ""s;
    do
    {
        cout << "Enter your password : "s;
        getline(cin, password);
        cin.ignore();
    } while (!IsValidPassword(password));
 
    string registration_time = GetCurrentTime();
 
    string entry_time = ""s;
 
    return { email, login, password, registration_time, entry_time };
}
 
//Функция получения записей из файла и записи их в вектор
vector<Users> GetDataFromFile()
{
    vector<Users> users = {};
 
    ifstream file(FILE);
 
    if (file.is_open())
    {
        Users user;
 
        while (file >> user.login >> user.email >> user.password >> user.registration_time >> user.entry_time)
        {
 
            users.push_back(user);
        }
        file.close();
    }
    else
    {
        throw("Data could not be retrieved from the file!"s);
    }
 
    return users;
}
 
// Функция для записи данных пользователя в файл
void WriteToFile(const Users& user)
{
    ofstream file(FILE, ios::app);
 
    if (file.is_open())
    {
        file << user.login << " " << user.email << " " << user.password << " " << user.registration_time << " [ " << user.entry_time << " ]" << endl;
    }
    else
    {
        throw "User data could not be recorded!"s;
    }
    file.close();
}
 
//проверки корректности данных для входа
bool FindUserByLogin(const string& target_email, const string& target_password, const vector<Users>& user)
{
    for (const auto& us : user)
    {
        if (us.email == target_email && us.password == target_password)
        {
            return true;
        }
    }
 
    return false;
}
 
//Функция получения логина пользователя
string GetLogin(const string& target_email, const vector<Users>& user)
{
    for (const auto& us : user)
    {
        if (us.email == target_email)
        {
            return us.login;
        }
    }
    return ""s;
}
 
//Функция для основного меню
void menu()
{
    int user_choice = 0;
    bool yes_no = true;
 
    Users user;
 
    do
    {
        cout << "1.Registration"s << endl;
        cout << "2.Input"s << endl;
        cout << "3.Output"s << endl;
 
        cout << "Select an item : "s;
        cin >> user_choice;
        cout << endl;
        cin.ignore();
 
        if (user_choice == 1)
        {
            user = AddCustomer();
            WriteToFile(user);  
        }
        
        if (user_choice == 2)
        {
            vector<Users> users = GetDataFromFile();
 
            cout << "Enter your email : "s;
            string email = ""s;
            getline(cin, email);
 
            cout << "Enter your password : "s;
            string password = ""s;
            getline(cin, password);
 
            if (IsValidPassword(password) && IsValidEmail(email))
            {
                if (FindUserByLogin(email, password, users))
                {
                    string login = GetLogin(email, users);
 
                    system("cls");
                    cout << endl << "You have successfully logged in as - "s << login << endl << endl;
 
                    Users user;
                    user.entry_time = GetCurrentTime();
                    //WriteToFile(user);
                }
                else
                {
                    cout << "The user was not found"s << endl;
                }
            }
            else
            {
                cout << "Invalid email or password"s << endl;
            }
            
        }
 
        if (user_choice == 3)
        {
            yes_no = false;
            break;
        }
    } while (yes_no);
}
 
int main()
{
    menu();
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.03.2024, 13:34
Ответы с готовыми решениями:

Система авторизации в C++
Вообщем где-то на форуме находил код авторизации, но он почему-то не работал. Я немного подкорректировал его и оставил как есть. Что...

Система авторизации
В программе заданы три логина, которые разрешают работу с программой и выдают сообщение: Добро пожаловать!. Если пользователь введет...

Формы для авторизации и входа
Друзья! у меня что то не получается выдает вот такую вот ошибку: Warning: Cannot modify header information - headers already sent by...

12
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.03.2024, 13:45
Текстовый файл можно только целиком перезаписать.
0
8 / 8 / 4
Регистрация: 08.12.2022
Сообщений: 157
11.03.2024, 13:46  [ТС]
nmcf, а каким типом файлов лучше пользоваться в этом случае?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.03.2024, 14:02
Бинарным с фиксированым размером записи.
Ты можешь попробовать, конечно, и текстовый открыть как бинарный и перезаписать дату поверх имеющейся, если она постоянной длины.
1
8 / 8 / 4
Регистрация: 08.12.2022
Сообщений: 157
11.03.2024, 14:03  [ТС]
nmcf, да, дата постоянной длинны возвращается из функции
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.03.2024, 14:18
Тебе проще перезаписать файл. Все данные в users уже считываются - вноси изменения в него, а потом записывай всё в файл.
0
8 / 8 / 4
Регистрация: 08.12.2022
Сообщений: 157
11.03.2024, 14:20  [ТС]
nmcf, данные перезаписываются, но когда делал функцию для обновления времени последнего входа, почему-то это поле записывалось в конце файла, а не в нужном месте
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.03.2024, 14:32
Ну потому что ты добавляешь в конец, а надо перезаписать файл полностью, сохранив туда users. Открывай без ios::app.
0
8 / 8 / 4
Регистрация: 08.12.2022
Сообщений: 157
11.03.2024, 14:41  [ТС]
nmcf, Так правильно?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <regex>
#include <ctype.h>
#include <chrono>
 
// Макрос для пути к файлу
#define FILE "D:\InfoUsers.txt"
 
using namespace std;
 
// Структура для хранения данных пользователя
struct Users
{
    string email = ""s;
    string login = ""s;
    string password = ""s;
    string registration_time = ""s;
    string last_entry_time = ""s;
};
 
//Функция проверки корректности почты
bool IsValidEmail(const string& email)
{
    regex emailRegex("([a-zA-Z0-9]+)(\\.[a-zA-Z0-9]+)*@([a-zA-Z0-9]+)(\\.[a-zA-Z0-9]+)*");
    return regex_match(email, emailRegex);
}
 
//Функция проверки соответствия пароля заданным требованиям
bool IsValidPassword(const string& password)
{
    bool has_special_char = false;
    bool has_upper_case = false;
    bool has_lower_case = false;
 
    if (password.length() < 10)
    {
        return false;
    }
 
    for (char c : password)
    {
        if (!isalnum(c))
        {
            has_special_char = true;
        }
        if (isupper(c))
        {
            has_upper_case = true;
        }
        if (islower(c))
        {
            has_lower_case = true;
        }
    }
    return has_special_char && has_upper_case && has_lower_case;
}
 
//Функция для получения текущей даты и времени
string GetCurrentTime()
{
    std::chrono::zoned_time now{ std::chrono::current_zone(), std::chrono::system_clock::now() };
 
    ostringstream oss;
    oss << format("{:%d.%m.%Y-%H:%M}", now.get_local_time());
    string nowString = oss.str();
 
    return nowString;
}
 
// Функция для добавления нового пользователя
Users AddCustomer()
{
    string login = ""s;
    cout << "Enter your login : ";
    getline(cin, login);
    cin.ignore();
 
    string email = ""s;
    do
    {
        cout << "Enter your email : "s;
        getline(cin, email);
        cin.ignore();
    } while (!IsValidEmail(email));
 
    string password = ""s;
    do
    {
        cout << "Enter your password : "s;
        getline(cin, password);
        cin.ignore();
    } while (!IsValidPassword(password));
 
    string registration_time = GetCurrentTime();
 
    string last_entry_time = "NULL"s;
 
    return { email, login, password, registration_time, last_entry_time };
}
 
//Функция получения записей из файла и записи их в вектор
vector<Users> GetDataFromFile()
{
    vector<Users> users = {};
 
    ifstream file(FILE);
 
    if (file.is_open())
    {
        Users user;
 
        while (file >> user.login >> user.email >> user.password >> user.registration_time >> user.last_entry_time)
        {
 
            users.push_back(user);
        }
        file.close();
    }
    else
    {
        throw("Data could not be retrieved from the file!"s);
    }
 
    return users;
}
 
// Функция для записи данных пользователя в файл
void WriteToFile(const Users& user)
{
    ofstream file(FILE);
 
    if (file.is_open())
    {
        file << user.login << " " << user.email << " " << user.password << " " << user.registration_time << " " << user.last_entry_time << endl;
    }
    else
    {
        throw "User data could not be recorded!"s;
    }
    file.close();
}
 
//проверки корректности данных для входа
bool FindUserByLogin(const string& target_email, const string& target_password, const vector<Users>& user)
{
    for (const auto& us : user)
    {
        if (us.email == target_email && us.password == target_password)
        {
            return true;
        }
    }
 
    return false;
}
 
//Функция получения логина пользователя
string GetLogin(const string& target_email, const vector<Users>& user)
{
    for (const auto& us : user)
    {
        if (us.email == target_email)
        {
            return us.login;
        }
    }
    return ""s;
}
 
void UpdateLastEntryTime(const string& target_login)
{
    vector<Users> users = GetDataFromFile();
 
    for (auto& user : users)
    {
        if (user.login == target_login)
        {
            user.last_entry_time = GetCurrentTime();
        }
    }
}
 
//Функция для основного меню
void menu()
{
    int user_choice = 0;
    bool yes_no = true;
 
    Users user;
 
    do
    {
        cout << "1.Registration"s << endl;
        cout << "2.Input"s << endl;
        cout << "3.Output"s << endl;
 
        cout << "Select an item : "s;
        cin >> user_choice;
        cout << endl;
        cin.ignore();
 
        if (user_choice == 1)
        {
            user = AddCustomer();
            WriteToFile(user);  
        }
        
        if (user_choice == 2)
        {
            vector<Users> users = GetDataFromFile();
 
            cout << "Enter your email : "s;
            string email = ""s;
            getline(cin, email);
 
            cout << "Enter your password : "s;
            string password = ""s;
            getline(cin, password);
 
            if (IsValidPassword(password) && IsValidEmail(email))
            {
                if (FindUserByLogin(email, password, users))
                {
                    string login = GetLogin(email, users);
 
                    system("cls");
                    cout << endl << "You have successfully logged in as - "s << login << endl << endl;
 
                    Users user;
                    UpdateLastEntryTime(login);
                    WriteToFile(user);
                }
                else
                {
                    cout << "The user was not found"s << endl;
                }
            }
            else
            {
                cout << "Invalid email or password"s << endl;
            }
            
        }
 
        if (user_choice == 3)
        {
            yes_no = false;
            break;
        }
    } while (yes_no);
}
 
int main()
{
    menu();
}
Добавлено через 2 минуты
Программа при входе отрабатывает,но после этого файл становится пустым
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.03.2024, 14:43
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void WriteToFile(const vector<Users> &users)
{
    ofstream file(FILE);
 
    if (file.is_open())
    {
        for (const user &i : users)
            file << user.login << " " << user.email << " " << user.password << " " << user.registration_time << " " << user.last_entry_time << endl;
    }
    else
    {
        throw "User data could not be recorded!"s;
    }
    file.close();
}
C++
1
WriteToFile(users);
Добавлено через 1 минуту
И перед записью подправить время в users.
0
8 / 8 / 4
Регистрация: 08.12.2022
Сообщений: 157
11.03.2024, 14:52  [ТС]
Эта функция будет же изменять нужное поле?

C++
1
2
3
4
5
6
7
8
9
10
11
12
void UpdateLastEntryTime(const string& target_login)
{
    vector<Users> users = GetDataFromFile();
 
    for (auto& user : users)
    {
        if (user.login == target_login)
        {
            user.last_entry_time = GetCurrentTime();
        }
    }
}
Это часть кода для входа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
if (user_choice == 2)
{
    vector<Users> users = GetDataFromFile();
 
    cout << "Enter your email : "s;
    string email = ""s;
    getline(cin, email);
 
    cout << "Enter your password : "s;
    string password = ""s;
    getline(cin, password);
 
    if (IsValidPassword(password) && IsValidEmail(email))
    {
        if (FindUserByLogin(email, password, users))
        {
            string login = GetLogin(email, users);
 
            system("cls");
            cout << endl << "You have successfully logged in as - "s << login << endl << endl;
 
            UpdateLastEntryTime(login);
            WriteToFile(users);
        }
        else
        {
            cout << "The user was not found"s << endl;
        }
    }
    else
    {
        cout << "Invalid email or password"s << endl;
    }
    
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.03.2024, 16:22
Лучший ответ Сообщение было отмечено Ifreqo как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
void UpdateLastEntryTime(vector<Users> &users, const string& target_login)
{
    for (auto& user : users)
    {
        if (user.login == target_login)
        {
            user.last_entry_time = GetCurrentTime();
            return;
        }
    }
}
C++
1
2
            UpdateLastEntryTime(users, login);
            WriteToFile(users);
1
8 / 8 / 4
Регистрация: 08.12.2022
Сообщений: 157
11.03.2024, 17:37  [ТС]
nmcf, сделал немного по другому уже, но спасибо за помощь)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2024, 17:37
Помогаю со студенческими работами здесь

Создание формы входа и авторизации
нужно написать простенькую программу где будет окно входа и авторизации

Отмена авторизации входа в систему
Добрый день! После регистрации на сайте Microsoft система при запуске стала запрашивать авторизацию с вводом логина и пароля, указанных...

Yii попытки входа при авторизации
как сделать чтобы при 5 неуспешных попытках вход был заблокирован на какое то время

Всплывающее окно авторизации входа на русском - плагин
Порекомендуйте плагин всплывающего окна авторизации на сайте (входа в админку, консоль) Стильное, красивое, классическое окошко. Именно...

Пропало окно для авторизации входа в админку
Доброго времени суток уважаемые форумчане. Сразу приношу свои извинения если создал тему, которая уже обсуждалась. Пропало окно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru