Форум: "Начинающим";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
ВнизВопрос касается удаления записи из типизированного файла. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c