Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

Вопрос касается удаления записи из типизированного файла.   Найти похожие ветки 

 
Drone   (2007-02-05 15:13) [0]

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


 
Desdechado ©   (2007-02-05 15:20) [1]

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


 
Elen ©   (2007-02-05 15:20) [2]


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

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


 
Leff ©   (2007-02-05 15:23) [3]

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


 
Elen ©   (2007-02-05 15:24) [4]


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

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


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

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


 
Elen ©   (2007-02-05 15:28) [6]


> Drone

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


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

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


 
Leff ©   (2007-02-05 15:32) [8]

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


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


 
Elen ©   (2007-02-05 15:37) [9]


> Leff

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


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

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


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

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


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

> [11] Drone   (05.02.07 15:40)

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.08 c
15-1170559011
Лирик
2007-02-04 06:16
2007.02.25
Шарик падает вдоль стенки и начинает её касаться без проскальзыва


15-1170374311
hmmm
2007-02-02 02:58
2007.02.25
PHPMyAdmin


2-1170781439
Novichok_new
2007-02-06 20:03
2007.02.25
получить часть строки


6-1157879032
yuorn4ik
2006-09-10 13:03
2007.02.25
Настройки локальной сети


2-1170612847
Lamer_5
2007-02-04 21:14
2007.02.25
Как работать с таймером?