Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос касается удаления записи из типизированного файла. [D7, WinXP]


Drone ©   (2007-02-05 15:13:00) 

Уважаемые,решаю тестовую задачу.Нужно реализовать консольный телефонный справочник.Команды аdd,find сделал,при этом информацию храню в типизир.файле.Как реализовать удаление записи из этого файла?


RASkov   (2007-02-05 16:26:00) [1]

> [11] Drone   (05.02.07 15:40)

Можно такую логику:

например файл из 10 записей, удаляем 3-ю:

встаем на последнию (10) читаем ее значения во врем. перем.
перемещаемся на 3-ю
меняем значение из врем. перем.
Seek на предпоследнюю
Truncate

Порядок следования при удалении будет меняться...


Drone   (2007-02-05 15:40:00) [2]

Я вот тоже думаю...Зачем я файлом начал париться?Взял бы лучше простенькую аccеss базу.


Drone   (2007-02-05 15:38:00) [3]

То есть если я объявил следующим образом:
Type
TContact=packed record
Name:string[20];
Number:string[20];
end
то можно просто последнюю запись двигать на место удаляемой и не париться?


Elen   (2007-02-05 15:37:00) [4]


> Leff

Да. Вообще то для этого есть СУБД разные, чем свое лепить лучше обратиться к ним.


Leff   (2007-02-05 15:32:00) [5]

> [4] Elen ©   (05.02.07 15:24)
>
> >  в случае с большим файлом долго
>
> Не обязательно.


хотя да, если не требуется сохранять последовательность записей :)
можно просто перенести последнюю запись на место записываемой
естественно все это при условии что записи постоянной длины


Drone   (2007-02-05 15:31:00) [6]

Спасибо..Буду разбираться.


Elen   (2007-02-05 15:28:00) [7]


> Drone

Зачем. Запиши данные в массив в память а потом пропускай запись ненужных в файл, или считай следующие записи за удаленной, а в файле передвинься на позицию за удаленной (seek) и запиши что считал


Drone   (2007-02-05 15:26:00) [8]

Какая последовательность действий должна быть при таком способе?Открывать основной файл,создать новый,записать в него необходимые записи,закрыть основной,удалить основной,сохранить новый под именем основного?


Elen   (2007-02-05 15:24:00) [9]


>  в случае с большим файлом долго

Не обязательно.


Leff   (2007-02-05 15:23:00) [10]

Есть два варианта:
1. Смещать все данные в файле после записи на позицию этой записи - в случае с большим файлом долго
2. Добавить в запись признак "удаленности", т.е. для удаления достаточно в нужной записи проставить этот признак, после чего ее можно будет использовать для записи других значений - тут требуется реализовать чуть больше логики


Desdechado   (2007-02-05 15:20:00) [11]

Заведи в своем типе поле-признак удаленности.
И команду pack для очистки файла от удаленных.


Elen   (2007-02-05 15:20:00) [12]


> Как реализовать удаление записи из этого файла?

Переписать его заново без этой записи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо