Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Record

Автор: Tan 24.03.2007 19:40

Вроде несложно, но что - то не выходит, вот отрывок, который по идее удаляет 1 запись с номером n. Не знаю как всё это загнать в цикл (с eof вроде не выходит), выручайте. K изначально равен 1. Може что - то и не так написал, буду рад любой помощи!


seek(file1,n + k);
read (file1, REC);
seek (file1, n );
write (file1, REC);
inc (k);


Автор: volvo 24.03.2007 20:31

for i := n+1 to filesize(f) do begin
seek(f, i); read(f, rec);
seek(f, i-1); write(f, rec); // перезаписываем следующую запись на место предыдущей
end;
seek(f, i, filesize(f) - 1);
truncate(f); // последнюю запись убираем физически из файла



(набирал прямо здесь, так что могут быть огрехи, но смысл именно такой...)

Автор: Tan 24.03.2007 20:50

seek(f, i, filesize(f) - 1); 3 параметра ??

Добавлено через 4 мин.
и на 2й строчке вашего кода выдаёт disk read error

Автор: volvo 24.03.2007 21:25

Да, все правильно... Вылетает за границы файла. Я ж говорю, что не проверено.

Вот этот код работает - только что проверял:

var
f: file of integer;
i, X, n: integer;

begin
assign(f, '00100.dat');
rewrite(f);
for i := 0 to 10 do begin
write(f, i);
end;

writeln('before:');
reset(f);
while not eof(f) do begin
read(f, X);
writeln(X);
end;

writeln('after:');
n := 5; // <--- Номер удаляемой записи, начиная с 0 !!!

for i := n+1 to pred(filesize(f)) do begin
seek(f, i); read(f, X);
seek(f, i-1); write(f, X);
end;
seek(f, filesize(f) - 1);
truncate(f);

reset(f);
while not eof(f) do begin
read(f, X);
writeln(X);
end;
close(f);
end.


(переезжаем в "Задачи")

Автор: Tan 24.03.2007 21:29

огромное спасибо!