Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удалить текущую строку в типизированном файле. [D2005, 2000]


pkm ©   (2006-10-19 15:03:00) 

Доброе время суток. Подскажите плиз. как удалить текущую строку в типизированном файле? спасибо за внимание.


Slym   (2006-10-20 06:36:00) [1]

Не удаляй... а помечай как удаленный и при чтении отбрасывай...
при добавлении можно пробежаться по удаленным и перезаписать


Anatoly Podgoretsky   (2006-10-19 18:58:00) [2]

pkm   (19.10.06 15:23) [8]
Без проблем, читай блок из одного места, пиши в другое, далее обрезай файл.


palva   (2006-10-19 16:40:00) [3]

Можно, конечно, без дополнительного файла, но довольно сложно. Следующий пример удаляет пятую строку в файле sss.txt

{$APPTYPE CONSOLE}
var
 f: file of Char;
 c: Integer;
 b: Char;
 ps, p1, p2: Integer;
begin
 AssignFile(f, 'sss.txt');
 Reset(f);
 ps := FileSize(f);
 c := 1;
 
 repeat
   Read(f, b);
   if ord(b) = 10 then inc(c);
 until c = 5;
 p1 := filepos(f); // позиция начала пятой строки
 repeat
   Read(f, b);
 until ord(b) = 10;
 p2 := filepos(f); // позиция начала шестой строки
 // затираем пятую строку перенося по одному байту вверх
 repeat
   Seek(f, p2); Read(f, b); Inc(p2);
   Seek(f, p1); Write(f, b); Inc(p1);
 until p2 = ps;

 truncate(f); // обрезаем файл на диске

 CloseFile(f);
end.

Для простоты у нас буфер - один байт. Поэтому программа работает медленно. Правда, это будет заметно только на больших файлах. Можно взять большой буфер, тогда придется сильно усложнять программу. Это уж поробуйте сами.


pkm   (2006-10-19 16:19:00) [4]

Ну большущее спасибо.


Джо   (2006-10-19 15:30:00) [5]

> [8] pkm   (19.10.06 15:23)
> Я думал есть, хоть один вариант, где не надо создавать дополнительные
> файлы.

Есть. Читаем весь файл в память, в соответствующую структуру. Затем перезаписываем старый файл данными из структуры, опускаю ненужную запись. Как видишь, обошлись без дополнительного файла.


stone   (2006-10-19 15:27:00) [6]


> pkm   (19.10.06 15:23) [8]
> Я думал есть, хоть один вариант, где не надо создавать дополнительные
> файлы.

По другому не бывает


pkm   (2006-10-19 15:23:00) [7]


> Вариантов - туева хуча.
>
> тебе какой ? 8-й ? столохматый ?


Я думал есть, хоть один вариант, где не надо создавать дополнительные файлы.


Джо   (2006-10-19 15:21:00) [8]

> [6] pkm   (19.10.06 15:20)
> Попутался. Я вместо таблиц хотел сказать (написать) файлы.
> Конец рабочего дня голова кругом.

Ну, так ответ был дан еще в посте [1].


pkm   (2006-10-19 15:20:00) [9]

Попутался. Я вместо таблиц хотел сказать (написать) файлы. Конец рабочего дня голова кругом.


Джо   (2006-10-19 15:13:00) [10]

Какие таблицы? Какие строки? Ты о типизированных файлах или о чем?


Сергей М.   (2006-10-19 15:12:00) [11]


> pkm   (19.10.06 15:07) [3]


> таблиц


Упс ...
Чем дальше в лес, тем толще партизаны) ..

Откуда тут, позволь полюбопытствовать, взялись какие-то там "таблицы" ?

Ты читаешь вх.файл, строка за строкой, в порядке прочтения ... Все прочитанное тут же записываешь в вых.файл, за исключением того что записывать не следует по твоей логике


pkm   (2006-10-19 15:07:00) [12]

мне вариант, где можно обойтись без создания дополнительных таблиц. Если можно.


DrPass   (2006-10-19 15:04:00) [13]

В типизированных файлах нет строк. Но в общем случае - создать новый файл, переписать в него часть старого до удаляемых данных, потом - часть старого после удаляемых данных, удалить старый файл, переименовать новый


Сергей М.   (2006-10-19 15:04:00) [14]

Вариантов - туева хуча.

тебе какой ? 8-й ? столохматый ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо