Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Поиск данных в файле (http://forum.oszone.net/showthread.php?t=121836)

Luzuk 03-11-2008 11:24 941460

Поиск данных в файле
 
Вложений: 1
Всем доброго времени суток!
У метя тут возникла не большая проблема, помогите, пожалуйста, с ней разобраться.

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

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

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

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

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.

___oj 03-11-2008 11:50 941474

На вскидку.
Не правильно оргаеизован цикл
Код:

        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 03-11-2008 11:59 941480

Цитата:

Цитата ___oj
явно лишний кусочек здесь: »

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

___oj 03-11-2008 13:06 941526

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

fs.seekg( 0, ios::beg );
Это надо поместить перед while(!exit) ....

Luzuk 05-11-2008 03:07 943265

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

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

if(!fs.eof()) exit=true;
в итоге цикл заканчивался после первой итерации.
поменял на:
Код:

if(fs.eof()) exit=true;
И теперь все нормально работает ;)

Luzuk 05-11-2008 04:04 943273

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

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

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


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


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


Время: 14:44.

Время: 14:44.
© OSzone.net 2001-