Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.045 c
15-1170343618
ocean
2007-02-01 18:26
2007.02.25
Хочется пошутить в конце дня. Присоединяйтесь!


8-1151496434
Andrey_G
2006-06-28 16:07
2007.02.25
Многопоточный звук


2-1170850723
smaller
2007-02-07 15:18
2007.02.25
Не ловится исключительная ситуация:


2-1170858625
C@N
2007-02-07 17:30
2007.02.25
Старый добрый DOS...


15-1170460185
hmmm
2007-02-03 02:49
2007.02.25
заливка файла на сервер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский