Войти

Показать полную графическую версию : [решено] Поиск данных в файле


Luzuk
03-11-2008, 11:24
Всем доброго времени суток!
У метя тут возникла не большая проблема, помогите, пожалуйста, с ней разобраться.

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

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

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

Данные о пользователе хранятся в виде структуры.
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
На вскидку.
Не правильно оргаеизован цикл

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
явно лишний кусочек здесь: »

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

___oj
03-11-2008, 13:06
Причина всего-лишь в том что перед началом чтения цуазатель не установлен на начало:

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

Это надо поместить перед while(!exit) ....

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

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

И теперь все нормально работает ;)

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

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

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


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

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




© OSzone.net 2001-2012