Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2009, 14:48   #1
Лукманов Александр
работа не волк....
Форумчанин
 
Аватар для Лукманов Александр
 
Регистрация: 09.06.2008
Сообщений: 337
По умолчанию как удалить значение в типизированных файлах

Есть типизированный файл
Код:
TFile = record // (BD.txt)
znach: string [255];
end;

var
BD: file of TFile;
b: TFile;
num: integer;
Как удалить одно из значений файла? Если одному из значений "a" я присваиваю пустое значение,

Код:
b.znach:= ' ';
assignfile (BD, ExtractFilePath(paramstr(0)) + '\files\BD.txt');
reset(BD);

seek (bd, filesize (bd));
write (bd, b);
closefile(bd);
то оно всё равно занимает своё место:

Код:
assignfile (bd, ExtractFilePath(paramstr(0)) + '\files\BD.txt');
reset (bd);
for Num:=1 to FileSize (BD) do
begin
read (bd, b);
ShowMessage ('Znach=' + b.znach+',');
end;
В итоге к примеру получается: а, б, в, , г,

В общем как удалить. В гугле такую команду не нашёл. Извиняюсь если зря расписывал код.

Уже под сотню сообщений и никак не можете усвоить правила оформления кода тэгом?
Тогда вам и программирование противопоказано.
Цель, для которой требуются неправые средства, не есть неправая цель.

Последний раз редактировалось Лукманов Александр; 07.03.2009 в 15:13. Причина: пардон. забываю.
Лукманов Александр вне форума Ответить с цитированием
Старый 09.03.2009, 15:26   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Лукманов Александр
В общем как удалить.
А никак! :-) я серьёзно! :-)
Существуют несколько подходов к решению этой задачи.
Например, во многих БД (как простейший вариант - DBF) в каждой записи есть служебной поле DELETED
если в нём служебная отметка ("*") то эта запись считается удалённой.
Таким образом достигается высокая скорость удаления записи.

Следующий подход:
при удалении одной записи - надо просто каждую последующую переписать на место предыдущей (если удаляем 10-ю запись, то 11-ю запись пишем на место 10-й, 12-ю пишем на место 11-й и т.д. до конца файла.
После чего файлу делаем truncate (обрезаем длину файла на размер одной записи).. Это может быть ОЧЕНЬ долго!

и последний способ - сжатие удалённых записей - в новый файл переписываются все записи кроме тех, которые мы удалили (или которые были помечены как удалённые). После успешной записи исходный файл удаляем, новый файл переименовываем в имя исходого файла данных. всё. (BTW, именно так происходит сжатие удалённых записей в DBF файлах).

удачи.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.03.2009, 21:47   #3
Лукманов Александр
работа не волк....
Форумчанин
 
Аватар для Лукманов Александр
 
Регистрация: 09.06.2008
Сообщений: 337
По умолчанию

Спасибо большое. Первый пример самый классный. А ведь до него можно было и самому допереть.
Цель, для которой требуются неправые средства, не есть неправая цель.
Лукманов Александр вне форума Ответить с цитированием
Старый 10.03.2009, 10:07   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Следующий подход:
Есть вариант побыстрее:
Во временный файл переписываем (BlockRead-BlockWrite) скопом все байты до начала записи, потом от начала следующей записи до конца файла. И переименовываем файл.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отловить значение из таблицы? mik Microsoft Office Excel 5 27.10.2008 16:34
как получить значение переменной smoke888 PHP 3 20.06.2008 02:11
Как определить значение по графику? leonid Microsoft Office Excel 4 27.05.2008 08:48
Как посчитать сумму строк во всех текстовых файлах? qwestor PHP 8 30.12.2007 16:02
как удалить анти вирус( касперский 2006)если она не работает и ее не возможно удалить Alar Общие вопросы Delphi 0 29.10.2006 21:36