| imho.ws |
![]() |
|
|
|
# 1 |
|
Member
Регистрация: 30.05.2003
Адрес: Литва
Пол: Male
Сообщения: 329
![]() ![]() ![]() ![]() ![]() ![]() |
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.
Спасибо! |
|
|
|
|
# 3 |
|
Guest
Сообщения: n/a
|
Быстро удалить запись из файла можно перемещением
т.е. последнюю запись в файле переписывают на место удаляемой, а затем уменьшают длину файла на одну запись. В вашем примере так и сделано. Только удаляется следующая за нужной запись seek(doum,i). Последнюю запись условие if i>filesize(duom)-1 не даст удалить. Люди привыкли все считать начиная с 1 , а записи в файле считаются с 0. второй reser(doum) лишний. |
|
|
# 4 |
|
Member
Регистрация: 30.05.2003
Адрес: Литва
Пол: Male
Сообщения: 329
![]() ![]() ![]() ![]() ![]() ![]() |
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.
|
|
|
|
|
# 7 | |
|
Guest
Сообщения: n/a
|
Цитата:
1. файл c:\duomenys.txt не существует. 2. размер фала меньше чем одна запись. 3. файл защищен от записи. Добавьте в начало программы {$I+} I/O checking будут выдаваться сообщения об ошибках при операциях с файлом. |
|
|
|
# 8 |
|
Member
Регистрация: 30.05.2003
Адрес: Литва
Пол: Male
Сообщения: 329
![]() ![]() ![]() ![]() ![]() ![]() |
заметил такую вещь, что эта процедура удаляет только почему то телефоны с коротким номером, к примеру 1, а когда в списле есть номера с более длинным номером, то последний уже не видит ;(
Да, и ещё заметил, когда в списке длинный и короткмй номер, то при попытке стиреть короткмй - стирается длинный Что де делать ;( ? Последний раз редактировалось Yurij; 26.05.2006 в 13:34. |
|
|