![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос касается удаления записи из типизированного файла. [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]
> Как реализовать удаление записи из этого файла?
Переписать его заново без этой записи.