Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/48: Рейтинг темы: голосов - 48, средняя оценка - 4.75
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891

Реализация авторизации...

22.09.2009, 23:14. Показов 9445. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, передо мной стоит задача, сделать прогу с системой авторизации (ввод логина и пароля) со всякими прибомбасами (работаю в C++ Builder 2010).
Пока у меня она находится на самом начальном уровне, но уже возникли сложности.
Сейчас мне надо, чтобы при нажатии на кнопку срабатывала проверка введенного пароля: обращаемся к файлу, в которм уже забит пароль, изымаем его оттуда и сравниваем с тем, что был введен в поле Edit. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Button4Click(TObject *Sender)
{
AnsiString apass=Form1->Edit1->Text;
FILE* f = fopen ("admin.txt", "r+");
if (f == NULL)
{ShowMessage ("Файл не открыт");
return;}
char pass[30];
fscanf (f, "%s", pass);
if ( apass != pass )
{ShowMessage ("Неверный пароль");
return;}
ShowMessage ("Верный пароль");
}
Так вот.. при нажатии кнопки всегда выводит "Файл не открыт", хотя admin.txt создан (разумеется в том же каталоге, где и проект) =(((
Ребят, очень прошу помощи...

Добавлено через 19 минут
Плин... Я мегадаун!) Оказывается, файл надо было поместить в папочку debug =)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2009, 23:14
Ответы с готовыми решениями:

Реализация авторизации
Здравствуйте форумчане! У меня возникла проблема в реализации следующего функционала: Имеется три формы Form1, Form2, Form3. ...

Реализация авторизации
Всем привет!Я создал авторизацию такого типа: <?php session_start(); ?> <?php if(empty($_SESSION) or...

Реализация авторизации
Здравствуйте, подскажите пожалуйста, как реализовать так, чтобы пользователь который не авторизовался на сайте не смог увидеть его...

24
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
22.09.2009, 23:45
Знаете у меня в Builder’e все замечательно получилось…
Попробуйте все-таки дать полный путь к admin.txt.
Можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  AnsiString apass = Edit1->Text;
  String pass_file = ExtractFilePath(Application->ExeName)+"admin.txt";
  FILE* f = fopen(pass_file.c_str(), "r+");
  if (f == NULL)
  {
    ShowMessage ("Файл не открыт");
    return;
  }
  char pass[30];
  fscanf (f, "%s", pass);
  if ( apass != pass )
  {
    ShowMessage ("Неверный пароль");
    return;
  }
  ShowMessage ("Верный пароль");
}
Добавлено через 4 минуты
Ну, может быть пригодится. Хотя-бы как пример форматирования кода
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
23.09.2009, 08:24
Да! Я сразу не заметил!
У Вас при таком сравнении
C++
1
if ( apass != pass )
всегда будет "Неверный пароль".
А надо либо сравнивать строки:
C++
1
if ( apass != AnsiString(pass) )
или массивы char
C++
1
if(strcmp(apass.c_str(), pass) != 0)
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
23.09.2009, 17:24  [ТС]
Вы знаете, у меня все и так работает: if ( apass != pass )

Добавлено через 44 минуты
Очередная трабла... А точнее непонятный момент... Задача: у меня 2 текстовых поля, из одного берется введенная инфа и записывается файл, после этого эта инфа из файла считывается и выводится на второе текстовое поле. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
AnsiString ulogin=Form1->Edit3->Text;
FILE* f = fopen ("users.txt", "r+");
if (f == NULL)
{ShowMessage ("Файл не открыт");
return;}
fprintf (f, "%s", ulogin);
fflush (f);
fseek (f, 0, SEEK_SET);
char qwe[30];
fscanf (f, "%s", qwe);
Form1->Edit4->Text=qwe;
fclose (f);
}
Объясните мне плиз необходимость строчки
C++
1
fseek (f, 0, SEEK_SET);
? Без нее на второе поле выводится абракадабра, а с сиком - все ок.
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
23.09.2009, 17:47
Цитата Сообщение от The_Immortal Посмотреть сообщение
Вы знаете, у меня все и так работает: if ( apass != pass )
В данном конкретном случае нам сильно помогает компилятор. Он стремится выровнять типы сравниваемых объектов, опираясь на тип первого. А он у нас AnsiString. Привести char к AnsiString плевое дело и в результате получаем
C++
1
if (apass != AnsiString(pass))
А вот поведите эксперимент, попробуйте сделать
C++
1
if (pass != apass)
т.е. поменять местами сравниваемые объекты...
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
23.09.2009, 17:59  [ТС]
АНК, спасибо большое за разъяснения... А не могли бы прокомментировать насчет функции fseek, пожалуйста?
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
23.09.2009, 18:02
Цитата Сообщение от The_Immortal Посмотреть сообщение
Объясните мне плиз необходимость строчки
C++
1
fseek (f, 0, SEEK_SET);
? Без нее на второе поле выводится абракадабра, а с сиком - все ок.
Ну, во-первых, хорошо бы форматировать код, легче будет читаться.
А, во-вторых, когда был сделан вывод в файл, то позиция указателя в файле сместилась и, чтобы прочитать введенные данные, надо указатель сместить на их начало. Что и выполняет fseek
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
25.09.2009, 16:48  [ТС]
Ребят, вот процедура создания нового пользователя и запись его в тхтшный файл в формате:
login password
login1 password1
...
loginN passwordN

Выше описана функция, которая считывает каждый логин (и пароль) и сравнивает его с введеным на форме логином, и в итоге если совпадают логины, то зарегиться пользователю на даем, выводим сообщение о том, что такой логин уже занят.
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
bool verify (const char* user)
{
  FILE * f1;
  f1 = fopen ("users.txt", "r");
  char u[40];
     while (!feof (f1))
     {
       fscanf (f1, "%s", u);
         if (!strcmp (u, user)) 
         return true;
      }
  return false;
}
 
void __fastcall TForm1::Button5Click(TObject *Sender)
{
    if (verify (AnsiString(Edit3->Text).c_str()) == true ) 
    {
     ShowMessage ("Already existed user");
     return;
    }
  AnsiString ulogin=Form1->Edit3->Text;
  AnsiString upass=Form1->Edit4->Text;
  FILE* f = fopen ("users.txt", "ab");
    if (f == NULL)
    {
     ShowMessage ("Файл не найден");
     return;
    }
  fprintf (f,"%s %s\n",ulogin,upass);
  fclose (f);
}
Как мне на основе этого можно сделать так, чтобы пара loginI passwordI удалялись из файла? Т.е. у меня имеется администраторская панель, там я собираюсь получать в ComboBox к примеру список всех логинов - в принципе это не трудно, надо будет считывать каждую нечетную строчку по идее. А после этого выбранный юзер должен удаляться, т.е. внутри файла должна будет удалиться запись логина и пароля (то есть строчка целиком, состоящая из 2ух строк, да и еще со смещением вверх...) Ну например:
до:
user 1234
uset 1235
usey 1236
после удаления юзера "uset" в файле должно остаться только:
user 1234
usey 1236

Как это попроще можно реализовать, подскажите, пожалуйста?
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
25.09.2009, 17:46
Вариант 1 (трудоемкий)
1. читаем файл в массив
2. удаляем из массива что надо
3. записываем массив в файл с тем же именем (не добавляем, а перезаписываем)

Вариант 2 ("Индийский" )
1. делаем на форме Memo (можно скрыть)
2. грузим из файла в Memo LoadFromFile("имя файла")
3. правим, сохраняем в файл SaveToFile("имя файла")

Вариант 3 (простейший)
1. Используем .ini файл
1
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
25.09.2009, 17:50
The_Immortal, вопрос к вам - зачем вы себе усложняете задачу, используя для хранения паролей и логинов обычный файл?
Есть же INI-файлы, для которых эти проблемы решены. Для примера вот такая структура
users.ini[Clobal]
CountUsers=3

[User1]
login=user
password=1234

[User2]
login=uset
password=1235

[User3]
login=usey
password=1236

А дальше смотрим описание TIniFile, как работать с ключами и секциями.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
25.09.2009, 17:57  [ТС]
GAV_13, АНК, эх, ребята... где же вы раньше были? =) Буду пробовать с ini! Огромнейшее спасибо за подсказку!
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
25.09.2009, 18:01
Да! И еще.
Наверное надо завести класс MyUser, который будет иметь свойства login, password и, возможно в дальнейшем, какие-то право доступа.
А так же конструктор, в котором в файл сохраняются данные юзера, и деструктор, который все это правильно удаляет.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
25.09.2009, 18:04  [ТС]
АНК, эм... Ну... ничего не понял, но ладно, попробую =)... Спасиб.
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
25.09.2009, 18:06
АНК, логично, я бы еще добавил в этот класс ф-ию по кодированию/декодированию ini файла (чтоб не прочитали блокнотом).
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
25.09.2009, 18:10  [ТС]
Блин...))) Мне бы хотя бы компонент этот обнаружить (TIniFile)... Нигде не могу его найти, чтобы на форму добавить...
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
25.09.2009, 18:13
The_Immortal, это не такой компонент))) его ручками добавлять надо)

Нажми F1 и в указателе введи TIniFile
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
25.09.2009, 18:18  [ТС]
GAV_13, а... мда... у Builder'a 2010 какой-то особенный хелп... "Исчерпывающая" инфа... А инет инфы не дает нужной по этому... Может попробую предложенный вами вариант №2 =)
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
25.09.2009, 18:21
Code
1
2
3
[Edits]
Edit1= Бла-бла бла)
Edit2=вот такой инишничек
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include IniFiles.hpp
 
TForm1 *Form1;
 
TIniFile *Ini = new TIniFile("users.ini");
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Ini->WriteString("Edits","Edit1",Edit1->Text); //
    Ini->WriteString("Edits","Edit2",Edit2->Text);
}
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Edit1->Text = Ini->ReadString("Edits","Edit1","А если там ничо нет");
    Edit2->Text = Ini->ReadString("Edits","Edit2","значение по умолчанию");
}
Добавлено через 1 минуту
Цитата Сообщение от The_Immortal Посмотреть сообщение
Может попробую предложенный вами вариант №2 =)
The_Immortal, не надо!!! это самый неправильный вариант) я его написал только потому, что так можно в принципе, но так не айс!
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
25.09.2009, 18:28  [ТС]
GAV_13, а то что АНК сообщил там насчет каких-то там классов, конструкторов и де.. чего-то =)) Это будет необходимо для моей задачи?..
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
25.09.2009, 18:38
в принципе - не обязательно. Но если заморочится - будет тебе же проще. Намного. Плюс - тот же класс можно будет использовать в других своих проектах...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.09.2009, 18:38
Помогаю со студенческими работами здесь

Реализация авторизации
Хочу сделать простейшую авторизацию продавца в базе, чтобы привязать его к "заказу". -Сделал форму ввода пароля. -Сделал...

Реализация окна авторизации в БД
Добрый день народ! Возникла проблемка, сразу скажу что я молод и горяч и неопытен к тому же, поэтому все что я делаю, это ...

Грамотная реализация авторизации
В разделе C++ Builder'a есть статья как правильнее реализовать авторизацию в приложении ...

Реализация авторизации на сайте
Мир вам! Подскажите, как реализовать авторизацию на сайте? Задача: предоставить доступ к определенной странице сайта по логину и паролю....

Реализация авторизации на сайте
Здравствуйте, у меня такая проблема, мне нужно было сделать регистрацию и авторизацию с bd. Регистрация получается, а авторизация...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru