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

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

22.09.2009, 23:14. Показов 9495. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru