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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2010, 21:27   #1
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
Радость Удаление записи из файла

Здравствуйте, у меня появился такой вопрос. Есть ли в Delphi стандартная функция для удаления какой-либо записи из файла? Нигде не нашел такой информации. Просто необходимо некоторую записи в файле заменить новой, а для этого ее надо удалить.

Сам я пробовал сделать свою функцию, но она работает слишком медленно. Вот она:

Код:
Procedure RecDel(Path: String; RecNum, RecSize: Integer);
var
  File: File;
  sFile: String;
  Size: Integer;
  i: Integer;
begin
//Считывание
  Size := FileSize(Path);
  SetLength(sFile, Size);
  AssignFile(File, Path);
  Reset(File, 1);
  for i := 1 to Size do
    BlockRead(File, sFile[i], 1);
  CloseFile(File);
//Уаление
  Delete(sFile, RecNum, RecSize);
//Запись
  Rewrite(File, 1);
  Seek(File, FileSize(Path));
  Truncate(File);
  for i := 1 to Length(sFile) do
    BlockWrite(File, sFile[i], 1);
  CloseFile(File);
end;
ZotaC вне форума Ответить с цитированием
Старый 09.12.2010, 00:08   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) непонятно, что Вам собственно надо...

2) так КАТЕГОРИЧЕСКИ нельзя.
Ну что ж, Вы всё правильно сделали, и даже процедуру правильную дёргаете, но в цикле!! По одному БАЙТУ!!
попробуйте заменить:
Цитата:
Код:
for i := 1 to Size do
    BlockRead(File, sFile[i], 1);
....

for i := 1 to Length(sFile) do
    BlockWrite(File, sFile[i], 1);
на
Код:
  BlockRead(File, sFile[1], Size);
...
  BlockWrite(File, sFile[1], Length(sFile));
p.s. это, так сказать, замена "в лоб", ибо я не разбирал, что же собственно Вам надо сделать (смотри мой вопрос нумер раз)...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.12.2010, 00:21   #3
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Спасибо, так стало работать намного быстрее. Впрочем, я делал почти так же, за исключением лишь одного: вместо sFile[1] писал просто sFile, после чего в нужном файле оказывались какие-то непонятные символы. Если несложно, не могли бы вы разъяснить, в чем причина этого и в чем разница?

Цитата:
непонятно, что Вам собственно надо...
Надо открыть любой файл, и на место одной записи (число типа Integer) поставить другую, заменив старую запись на новую. Теперь-то, конечно, дело за малым: просто вставить новое число в нужное место, и готово. А за цикл я взялся только по вышеописанной причине, конечно, понимая, что в этом и причина такой медленной работы программы.
ZotaC вне форума Ответить с цитированием
Старый 09.12.2010, 09:46   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
и на место одной записи (число типа Integer) поставить другую, заменив старую запись на новую.
Тогда вообще не понятны пляски с бубном вокруг чтения, циклов, транкейта файла и прочего...

если записывать надо ПОВЕРХ
достаточно
Код:
  Seek(f, нужное смещение);
  BlockWrite(f, НовоеЗначение);
и всё.


p.s. перед строкой находится служебная информация. а первый символ строки имеет индекс 1
поэтому Stroka[1] - это, фактически указатель на первый символ строки...
потом указываем длину строки.
(кстати, надо с этим аккуратнее, если строка WideString/Unicode - то каждый символ занимает больше одного байта,
поэтому длину строки лучше умножать на размер одного символа:
BlockWrite(f, UniString[1], Length(UniString)*SizeOf(Char));
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.12.2010, 17:43   #5
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Спасибо. Со строкой, вроде, разобрался. Тогда еще такой вопрос: функция Rewrite, которой я открывал файл для записи, заменяет уже существующий файл. То есть, как мне казалось, если просто вставить туда данные, то все остальные данные, которые были в файле до этого, просто сотрутся. Разве не так?
ZotaC вне форума Ответить с цитированием
Старый 09.12.2010, 19:24   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Rewrite, которой я открывал файл для записи, заменяет уже существующий файл
разумеется!!
Открывайте через Reset()!
и спокойно пишите через BlockWrite(..)
По умолчанию filemode (в Pascal/Delphi) равен чтение/запись.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление записи IraPr Microsoft Office Access 2 07.10.2010 17:22
Удаление текущей записи из файла Proger_1 Общие вопросы Delphi 4 15.05.2010 23:35
Удаление записи из файла данных в Pascal. Paster Помощь студентам 6 09.06.2009 18:48
Удаление записи из файла(Delphi) студентка Помощь студентам 1 16.12.2007 13:54
Удаление записи с файла werser Помощь студентам 8 27.06.2007 06:25