imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 25.05.2006, 12:46     # 1
Yurij
Member
 
Аватар для Yurij
 
Регистрация: 30.05.2003
Адрес: Литва
Пол: Male
Сообщения: 329

Yurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царстве
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.
Подскажите, как можно легче и правильнее создать удаление записи по номеру телефона.(т.е. абонимента)
Спасибо!
Yurij вне форума  
Старый 25.05.2006, 13:53     # 2
Andrewpg
Junior Member
 
Регистрация: 09.09.2004
Сообщения: 179

Andrewpg Известность не заставит себя ждать
Самый простой способ - в твой тип
type
zapis=record .....
добавь еще одно поле "Признак удаления". И изменяй его и проверяй!
__________________
"О, как тоскливо ехать без мигалки!"
Andrewpg вне форума  
Старый 25.05.2006, 14:40     # 3
MrSerg
Guest
 
Сообщения: n/a

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

В вашем примере так и сделано.
Только удаляется следующая за нужной запись seek(doum,i).
Последнюю запись условие if i>filesize(duom)-1 не даст удалить.
Люди привыкли все считать начиная с 1 , а записи в файле считаются с 0.
второй reser(doum) лишний.
 
Старый 25.05.2006, 15:59     # 4
Yurij
Member
 
Аватар для Yurij
 
Регистрация: 30.05.2003
Адрес: Литва
Пол: Male
Сообщения: 329

Yurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царстве
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.
Yurij вне форума  
Старый 25.05.2006, 16:05     # 5
MrSerg
Guest
 
Сообщения: n/a

Только еще seek(doum,i-1); и вполне рабочая версия.
 
Старый 25.05.2006, 22:28     # 6
Yurij
Member
 
Аватар для Yurij
 
Регистрация: 30.05.2003
Адрес: Литва
Пол: Male
Сообщения: 329

Yurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царстве
MrSerg,хм... странно. но почему то он удолять так и не хочет. Всегда пишет,что книжка пуста ;(
Yurij вне форума  
Старый 26.05.2006, 08:45     # 7
MrSerg
Guest
 
Сообщения: n/a

Цитата:
Сообщение от Yurij
хм... странно. но почему то он удолять так и не хочет. Всегда пишет,что книжка пуста
Может быть несколько причин:
1. файл c:\duomenys.txt не существует.
2. размер фала меньше чем одна запись.
3. файл защищен от записи.
Добавьте в начало программы {$I+} I/O checking будут выдаваться сообщения об ошибках при операциях с файлом.
 
Старый 26.05.2006, 13:24     # 8
Yurij
Member
 
Аватар для Yurij
 
Регистрация: 30.05.2003
Адрес: Литва
Пол: Male
Сообщения: 329

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

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

Последний раз редактировалось Yurij; 26.05.2006 в 13:34.
Yurij вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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