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

Ответить
Аватара пользователя
Luzuk

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

Сообщение Luzuk »

Всем доброго времени суток!

У метя тут возникла не большая проблема, помогите, пожалуйста, с ней разобраться.



Задача:

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



Проблема:

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



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



Данные о пользователе хранятся в виде структуры.



Код:

Код: Выделить всё

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.
Вложения
Login_pass.zip
(5.01 КБ) 0 скачиваний
Login_pass.zip
(5.01 КБ) 0 скачиваний
Аватара пользователя
___oj

Re: C/C++ - [решено] Поиск данных в файле

Сообщение ___oj »

На вскидку.

Не правильно оргаеизован цикл

Код:

Код: Выделить всё

        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; //если конец файла ставим флаг на выход
           }

т.к прочитав в структуру, сверяешь данные и если они не совпадают, перескакиваешь через одну и читаещь следующую. Вряд ли "Так надо".
Аватара пользователя
Luzuk

Re: C/C++ - [решено] Поиск данных в файле

Сообщение Luzuk »

Цитата ___oj:



явно лишний кусочек здесь:
C/C++ - [решено] Поиск данных в файле




Пасибо! Почему-то я подумал, что при прочтении куска файла он отсается на месте.

Убрал fs.seekg, но все равно, это не помогла...
Аватара пользователя
___oj

Re: C/C++ - [решено] Поиск данных в файле

Сообщение ___oj »

Причина всего-лишь в том что перед началом чтения цуазатель не установлен на начало:

Код:

Код: Выделить всё

 fs.seekg( 0, ios::beg );

Это надо поместить перед while(!exit) ....
Аватара пользователя
Luzuk

Re: C/C++ - [решено] Поиск данных в файле

Сообщение Luzuk »

___oj, спасибо еще раз.

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



Я там еще одну ошибку нашел, вот тут:



Код:

Код: Выделить всё

 if(!fs.eof()) exit=true;

в итоге цикл заканчивался после первой итерации.

поменял на:



Код:

Код: Выделить всё

if(fs.eof()) exit=true;

И теперь все нормально работает Изображение
Аватара пользователя
Luzuk

Re: C/C++ - [решено] Поиск данных в файле

Сообщение Luzuk »

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



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

- добавление новых пользователей, с проверкой их существования;

- вывод в список всех пользователей из файла;

- редактирования пользователей в списке на выбор.



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





P.S.

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




P.P.S.

Просьба модераторам закрыть тему, т.к. данная задача решена полностью.
Вложения
Login_pass.zip
(78.01 КБ) 0 скачиваний
Login_pass.zip
(78.01 КБ) 0 скачиваний
Ответить

Вернуться в «Программирование и базы данных»