Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Поиск данных в файле

Ответить
Настройки темы
C/C++ - [решено] Поиск данных в файле

Новый участник


Сообщения: 44
Благодарности: 7

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip Login_pass.zip
(5.0 Kb, 122 просмотров)
Всем доброго времени суток!
У метя тут возникла не большая проблема, помогите, пожалуйста, с ней разобраться.

Задача:
Необходимо добавлять и находить данные о пользователях, при этом эти данные должны храниться в файле.

Проблема:
Не могу разобраться с поиском в файле, нахожу только последнюю запись.

Как должна работать программа:

Данные о пользователе хранятся в виде структуры.
Код: Выделить весь код
struct user
{
    char name[16];     //имя пользователя - строка в стиле Си (массив символов)
    unsigned int len;   //длина пароля
    char pass[16];     //пароль пользователя - массив символов
    bool block;         //признак блокировки учетной записи
    unsigned int opt;   //признак включения ограничений на выбираемые пароли
};
Все данные хранятся в файле.

Необходима функция добавления новых пользователей в файл.
Также необходима функция поиска среди существующих пользователей по их логину и паролю в созданном файле.

Как получилось:
Получилось все, кроме поиска пользователей в файле. Точней она находит запись по пользователю, только если эта запись в конце файла, а остольные пропускает.

Вот листинг этой функции:
Код: Выделить весь код
    using namespace std;
     if(FileExists("MyFile.dat")) //проверяем наличие файла
     {
        //открываем файл на чтение
        fstream fs( "MyFile.dat", ios::in|ios::binary);
        if(!fs.is_open())
           stderr;

        struct user uu;  //структура для хранения данных
        Label5->Caption="FALSE";
   //fs.seekg(0);
        bool exit=false;  //флаг выхода из цикла
        while(!exit)
        {
           //читаем файл и копируем текущие данные в структуру
           fs.read((char *)&uu,  sizeof(uu)); 
           //если то что ввели совпало с тем что в структуре
           if((Edit3->Text==uu.name) && (Edit4->Text==uu.pass))
           {
                Label5->Caption="OK"; //говорим OK
                exit=true;            //ставим флаг на выход
           }
           else{
                fs.seekg(sizeof(uu),ios::cur); //смещаемся к следующей структуре в файле
                if(!fs.eof()) exit=true; //если конец файла ставим флаг на выход
           }
        }
        fs.close();
     }
     else  Label5->Caption="ERROR! File not faund";

Также прикрепляю к этому посту исходники всего проекта.
Проект создан на C++ Builder 6.

Отправлено: 11:24, 03-11-2008

 

Новый участник


Сообщения: 49
Благодарности: 17

Профиль | Отправить PM | Цитировать


На вскидку.
Не правильно оргаеизован цикл
Код: Выделить весь код
        while(!exit)
        {
           //читаем файл и копируем текущие данные в структуру
           fs.read((char *)&uu,  sizeof(uu)); 
           //если то что ввели совпало с тем что в структуре
           if((Edit3->Text==uu.name) && (Edit4->Text==uu.pass))
           {
                Label5->Caption="OK"; //говорим OK
                exit=true;            //ставим флаг на выход
           }
           else{
                fs.seekg(sizeof(uu),ios::cur); //смещаемся к следующей структуре в файле
                if(!fs.eof()) exit=true; //если конец файла ставим флаг на выход
           }
        }
явно лишний кусочек здесь:
Код: Выделить весь код
          else{
                fs.seekg(sizeof(uu),ios::cur); //смещаемся к следующей структуре в файле
                if(!fs.eof()) exit=true; //если конец файла ставим флаг на выход
           }
т.к прочитав в структуру, сверяешь данные и если они не совпадают, перескакиваешь через одну и читаещь следующую. Вряд ли "Так надо".
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:50, 03-11-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 44
Благодарности: 7

Профиль | Отправить PM | Цитировать


Цитата ___oj:
явно лишний кусочек здесь: »
Пасибо! Почему-то я подумал, что при прочтении куска файла он отсается на месте.
Убрал fs.seekg, но все равно, это не помогла...

Отправлено: 11:59, 03-11-2008 | #3


Новый участник


Сообщения: 49
Благодарности: 17

Профиль | Отправить PM | Цитировать


Причина всего-лишь в том что перед началом чтения цуазатель не установлен на начало:
Код: Выделить весь код
 fs.seekg( 0, ios::beg );
Это надо поместить перед while(!exit) ....

Отправлено: 13:06, 03-11-2008 | #4


Новый участник


Сообщения: 44
Благодарности: 7

Профиль | Отправить PM | Цитировать


___oj, спасибо еще раз.
Но вроде у меня оно и без fs.seekg( 0, ios::beg ); заработало.

Я там еще одну ошибку нашел, вот тут:
Код: Выделить весь код
 if(!fs.eof()) exit=true;
в итоге цикл заканчивался после первой итерации.
поменял на:
Код: Выделить весь код
if(fs.eof()) exit=true;
И теперь все нормально работает

Отправлено: 03:07, 05-11-2008 | #5


Новый участник


Сообщения: 44
Благодарности: 7

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip Login_pass.zip
(78.0 Kb, 437 просмотров)

Вот еще решил выложить готовые исходники этой программы. Может кому в качестве примера работы с файлами пригодится.

Программа обрабатывает данные о пользователях сохраненных в файле, реализовано следующие:
- добавление новых пользователей, с проверкой их существования;
- вывод в список всех пользователей из файла;
- редактирования пользователей в списке на выбор.

Программа написана на C++ Builder 6.


P.S.
Это пока пробная версия программы, что мне нужно написать, так что я еще возможно вернусь с новыми вопросами


P.P.S.
Просьба модераторам закрыть тему, т.к. данная задача решена полностью.

Последний раз редактировалось Luzuk, 05-11-2008 в 05:50. Причина: добавил просьбу модератору


Отправлено: 04:04, 05-11-2008 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Поиск данных в файле

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Строковый поиск в бинарном файле kt626 Скриптовые языки администрирования Windows 1 15-10-2009 06:45
[решено] Повторяющийся текст в файле. HORRIBLE AutoIt 3 14-08-2009 00:31
CMD/BAT - [решено] Изменение текста в файле tarasov.evgeny Скриптовые языки администрирования Windows 5 12-08-2009 16:21
MySQL - [решено] сохранение данных в базе данных Mysql TigerZaka Программирование и базы данных 4 24-08-2008 15:48
Delphi - Delphi | Ресурсы и поиск в файле Borislav Программирование и базы данных 1 10-02-2005 09:30




 
Переход