Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Файлы


Автор: SapFira 27.4.2007, 14:45
Программа осуществляет поиск актера по фильму. Надо чтобы при его нахождении она удаляла найденное и выводила на экран содержимое оставшегося файла. У меня ошибка выходит и программа не работает. Как правильно сделать удаление?? ПОМОГИТЕ ИСПРАВИТЬ smile 

Код

Uses Crt;
Type
 TActor=record
 fio:string[20];
 film:string[30];
end;
Type
 TActorsFile=file of TActor;

var

 af:TactorsFile;
 filename:string;
 i,j:integer;
 actor:TActor;
 film:string;
 f:file;
CurPos:integer;
Procedure DeletePos(Filename:string ; Pos:integer);
var
 af,bf:TActorsFile;
 tmp:TActor;
 
begin
 assign(af,Filename);
 reset(af);
 assign(bf,Filename);
 reset(bf);
 seek(af,Pos);
 seek(bf,Pos);
 read(af,tmp);
while not eof(af) do
begin
 read(af,tmp);
 write(bf,tmp);
end;
 close(af);
 truncate(bf);
 close(bf);
end;


begin 
 clrscr;
 write('Vvedite imy faila:');
 readln(filename);
 writeln('Vvedite imena acterov i ix filmy');
 writeln('Dly okon4aniya vvoda nazmite probel ');
 assign(af,filename);
 rewrite(af);
repeat
 write('Vvedite actera: ');
 readln(actor.fio);
 if actor.fio<>' ' then
 begin
  write('Vvedite actors film: ');
  readln(actor.film);
  write(af,actor);
 end;
until Actor.fio=' ';
close(af);
writeln;
write('Vvedite film dly naxozdeniya aktera: ');
readln(film);
assign(af,filename);
reset(af);
while not eof(af) do
begin
 read(af,actor);
 if actor.Film=film then
 begin
  writeln('Film:',actor.film);
  writeln('Actor:',actor.fio);
 CurPose:=FilePos(af);
DeletePos(filename,CurPos);
 end;
 DeletePos(Filename);
 close(af);
 assign(af,filename);
 reset(af);
 writeln;
 writeln('SODERZHIMOE FAILA:');
 writeln;
while not eof(af) do
begin
  read(af,actor);
  writeln('Film:',actor.film);
  writeln('Actor:',actor.fio);
end;
 close(af);
 writeln;
 writeln('Press any key to continue...');
 readln;
end;
end.


Тегами пользуемся...

Автор: powerfox 28.4.2007, 12:52
Цитата(SapFira @  27.4.2007,  15:45 Найти цитируемый пост)
 read(af,actor);

Так нельзя.
Нужно:
Код

read(af,actor.fio);
read(af,actor.film);


Остальное некогда разбирать.

Автор: TwisT_X 29.4.2007, 15:00
SapFira, не понял что тебе надо что бы удаляло!! Удалило фильм и актер, но передд этим вывело на экран или что?!  smile 

Автор: TBase 2.5.2007, 18:47
powerfox, 
Код

read(af,actor);

Код

Type    
 TActorsFile=file of TActor;

На этом этапе все верно...

Подозрения на многкратное открытие файла, функцию в любом случае придется переписывать...

Автор: ama_kid 3.5.2007, 09:52
Что-то мне это сильно напоминает, я кажется отвечал на такой вопрос где-то...  smile 
SapFira
Ну попробуй так:
Код
Uses Crt;
Type
 TActor=record
 fio:string[20];
 film:string[30];
end;
Type
 TActorsFile=file of TActor;

var

 af:TactorsFile;
 filename:string;
 i,j:integer;
 actor:TActor;
 film:string;
 f:file;
 CurPos:integer;

Procedure DeletePos(Filename:string ; Pos:integer);
var
 af,bf:TActorsFile;
 tmp:TActor;

begin
 assign(af,Filename);
 reset(af);
 assign(bf,Filename);
 reset(bf);
 seek(af,Pos);
 seek(bf,Pos);
 read(af,tmp);
while not eof(af) do
begin
 read(af,tmp);
 write(bf,tmp);
end;
 close(af);
 truncate(bf);
 close(bf);
end;


begin
 clrscr;
 write('Vvedite imy faila:');
 readln(filename);
 writeln('Vvedite imena acterov i ix filmy');
 writeln('Dly okon4aniya vvoda nazmite probel ');
 assign(af,filename);
 rewrite(af);
 repeat
  write('Vvedite actera: ');
  readln(actor.fio);
  if actor.fio<>' ' then
  begin
   write('Vvedite actors film: ');
   readln(actor.film);
   write(af,actor);
  end;
 until Actor.fio=' ';
 close(af);

 writeln;
 write('Vvedite film dly naxozdeniya aktera: ');
 readln(film);
 assign(af,filename);
 reset(af);
 while not eof(af) do
 begin
  read(af,actor);
  if actor.Film=film then
  begin
   writeln('Film:',actor.film);
   writeln('Actor:',actor.fio);
   CurPos:=FilePos(af);
   DeletePos(filename,CurPos-1);
  end;
 end;
 close(af);
 assign(af,filename);
 reset(af);
 writeln;
 writeln('SODERZHIMOE FAILA:');
 writeln;
 while not eof(af) do
  begin
   read(af,actor);
   writeln('Film:',actor.film);
   writeln('Actor:',actor.fio);
  end;
 close(af);
 writeln;
 writeln('Press any key to continue...');
 readln;
end.

Автор: Fighter 3.5.2007, 22:39
Цитата(ama_kid @  3.5.2007,  09:52 Найти цитируемый пост)
Что-то мне это сильно напоминает, я кажется отвечал на такой вопрос где-то...   SapFira



А ты посмотри. Тебе не кажется, что то что она сюда закинула и что ты закинул, по ходу дела - это две одинаковые вещи. 

Автор: ama_kid 4.5.2007, 07:33
Цитата(Fighter @  3.5.2007,  22:39 Найти цитируемый пост)
А ты посмотри. Тебе не кажется, что то что она сюда закинула и что ты закинул, по ходу дела - это две одинаковые вещи.  
Не, вещи немного разные, я закинул отредактированный вариант того, что закинула она... Я вспомнил - функцию DeletePos я ей подкидывал в http://forum.vingrad.ru/index.php?showtopic=145979&view=findpost&p=1097849, smile  причем это было чуть ли не месяц назад...  smile не думал, что так сложно ею будет воспользоваться...  smile 

Автор: SapFira 5.5.2007, 17:13
Спасибо! Наконец то я разобралась. У меня просто не получалось закинуть эту процедуру DeletePos и я решила положить сюда то что вышло.. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)