IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Pascal:удаление записи из файла. (https://www.imho.ws/showthread.php?t=104085)

Yurij 25.05.2006 12:46

Pascal:удаление записи из файла.
 
Всем привет!
Столкнулся с проблемой. Пишу телефонную книжку.Вроди, как ввод и вывод нормально работают, а вот со стираньем записи из файла беда.
Подсказали,что можно сделать, так как в этом примере, но у меня не работает.
В программе создаётся тип свой переменной:
type
zapis=record
imia:string[20];
fam:string[20];
god_r:string[20];
ulica:string[20];
kvartira:string[20];
tel:string[20];
end;
..... var p:zapis; duom : file of zapis;

Вся инфорамция записывается в эти переменные, нормально выводится. Вот сама проблематичная проблема стирания:
Код:

unit d_tr;
interface
      uses crt,d_iv;
procedure tel_tr;
implementation
type
    zapis=record
    imia:string[20];
    fam:string[20];
    god_r:string[20];
    ulica:string[20];
    kvartira:string[20];
    tel:string[20];
    end;
      var i:integer;
procedure tel_tr;
begin
clrscr;
vybor;
assign(duom, 'c:\duomenys.txt');
reset(duom);
if filesize(duom)=0  then begin
writeln;
write('Telefonnaja kniga pusta');
end else begin
write('Kakoj telefon budem stirat ?');
readln(i);
if i>filesize(duom)-1
then begin
writeln;
write('Takogo telefona v knige net!!!');
writeln('Vyberite menu');
end
else begin
reset(duom);
seek(duom,filesize(duom)-1);
read(duom,p);
seek(duom,i);
write(duom,p);
seek(duom,filesize(duom)-1);
truncate(duom);
write('Telefon stert!');
end;
end;
end;
end.

Подскажите, как можно легче и правильнее создать удаление записи по номеру телефона.(т.е. абонимента)
Спасибо!

Andrewpg 25.05.2006 13:53

Самый простой способ - в твой тип
type
zapis=record .....
добавь еще одно поле "Признак удаления". И изменяй его и проверяй!

MrSerg 25.05.2006 14:40

Быстро удалить запись из файла можно перемещением
т.е. последнюю запись в файле переписывают на место удаляемой, а затем уменьшают длину файла на одну запись.

В вашем примере так и сделано.
Только удаляется следующая за нужной запись seek(doum,i).
Последнюю запись условие if i>filesize(duom)-1 не даст удалить.
Люди привыкли все считать начиная с 1 , а записи в файле считаются с 0.
второй reser(doum) лишний.

Yurij 25.05.2006 15:59

MrSerg, ты имеешь в виду, что процедура должна выглядить так:

Код:


procedure tel_tr;
begin
clrscr;
vybor;
assign(duom, 'c:\duomenys.txt');
reset(duom);
if filesize(duom)=0  then begin
writeln;
write('Telefonnaja kniga pusta');
end else begin
write('Kakoj telefon budem stirat ?');
readln(i);
if i>filesize(duom)
then begin
writeln;
write('Takogo telefona v knige net!!!');
writeln('Vyberite menu');
end
else begin
seek(duom,filesize(duom)-1);
read(duom,p);
seek(duom,i);
write(duom,p);
seek(duom,filesize(duom)-1);
truncate(duom);
write('Telefon stert!');
close(duom);
end;
end;
end;
end.


MrSerg 25.05.2006 16:05

Только еще seek(doum,i-1); и вполне рабочая версия.

Yurij 25.05.2006 22:28

MrSerg,хм... странно. но почему то он удолять так и не хочет. Всегда пишет,что книжка пуста ;(

MrSerg 26.05.2006 08:45

Цитата:

Сообщение от Yurij
хм... странно. но почему то он удолять так и не хочет. Всегда пишет,что книжка пуста

Может быть несколько причин:
1. файл c:\duomenys.txt не существует.
2. размер фала меньше чем одна запись.
3. файл защищен от записи.
Добавьте в начало программы {$I+} I/O checking будут выдаваться сообщения об ошибках при операциях с файлом.

Yurij 26.05.2006 13:24

заметил такую вещь, что эта процедура удаляет только почему то телефоны с коротким номером, к примеру 1, а когда в списле есть номера с более длинным номером, то последний уже не видит ;(

Да, и ещё заметил, когда в списке длинный и короткмй номер, то при попытке стиреть короткмй - стирается длинный :confused:
Что де делать ;( ?


Часовой пояс GMT +4, время: 22:53.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.