Помощь - Поиск - Пользователи - Календарь
Полная версия: Перезапись строки типизированного файла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Анжелика
Всем привет! Ребят, помогите мне, пжл, изменить задачу. Тема такая: есть типизированный файл записей. Нужно изменить одну из записей этого файла. Программу я написала(см. код), но вот меняет она следующую строку, а не нужную. Подскажите, mega_chok.gif что надо изменить?
unit exch;
interface
uses crt,delit;
type
    osn=
    record
          gr:string;
          fio:string;
          sub:string;
          dt:string;
          pare:byte;
          les:char;
          pr:string;
    end;
    osnFile=file of osn;
procedure exchange;
implementation
{-------------------------------------------}
procedure del(var osnF:osnFile; i:integer);
var
   temp:osnFile;
   zap:osn;
   k:integer;
begin
     assign(temp,'temp.txt');
     rewrite(temp);
     seek(osnF,0);
     k:=0;
     repeat
           read(osnF,zap);
           if k<>i-1 then
              write(temp,zap);
           inc(k);
     until eof(osnF);
     rewrite(osnF);
     seek(temp,0);
     repeat
           read(temp,zap);
           write(osnF,zap);
     until eof(temp);
     close(temp);
     erase(temp);
end;
{-------------------------------------------}
procedure exchange;
var name:string;
    main,temp:osnFile;
    tzap:osn;
    l,i,k:integer;
    par:byte;
    lesson:char;
begin
     clrscr;
     write('Введите имя основного файла'); readln(name);
     assign(main,name); reset(main);
     writeln('Записи основного файла:');
     k:=0;
     repeat
           inc(k);
	   read(main,tzap);
	   writeln(k,'. '+tzap.gr+' '+tzap.fio+' '+tzap.sub+' '+tzap.dt+' ',
                                              tzap.pare,' '+tzap.les+' '+tzap.pr);
     until eof(main);
     write('Введите номер записи:');
     readln(i);
     seek(main,i-1);
     read(main,tzap);
     writeln;
     clrscr;
     writeln('Выбранная запись: '+tzap.gr+' '+tzap.fio+' '+tzap.sub+' '+tzap.dt+' ',
                                              tzap.pare,' '+tzap.les+' '+tzap.pr);
     writeln('Какое поле необходимо редактировать?');
     writeln('1-Группа');
     writeln('2-Фамилия И.О.');
     writeln('3-Предмет');
     writeln('4-Дата');
     writeln('5-Номер пары');
     writeln('6-Тип занятия');
     writeln('7-Присутствие');
     readln(l);
     write('Введите новое значение, выбранного поля:');
     case l of
	   1:begin readln(name); tzap.gr:=name end;
	   2:begin readln(name); tzap.fio:=name end;
	   3:begin readln(name); tzap.sub:=name end;
	   4:begin readln(name); tzap.dt:=name end;
	   5:begin readln(par); tzap.pare:=par end;
	   6:begin readln(lesson); tzap.les:=lesson end;
	   7:begin readln(name); tzap.pr:=name end;
     end;
     writeln('Записать изменения?(Y/N)');
     readln(name);
     if (name='y') or(name='Y')
     then
     begin
          del(main,i);
          write(main,tzap)
     end
     else
         writeln('Запись не изменена');
     writeln('Для продолжения нажмите Еnter');
     readkey;
end;
end.

Заранее спасибо! yes2.gif
Бродяжник
Не усложняйте задачу.
seek(main,i-1);
read(main,tzap);
{... редактируем запись...}
seek(main,i-1);
write(main,tzap);

Фишка в том, что файл, открытый по ресету, можно как читать, так и записывать.
Bokul
Цитата(Бродяжник @ 29.05.2006 4:53)
Не усложняйте задачу.
seek(main,i-1);
read(main,tzap);
{... редактируем запись...}
seek(main,i-1);
write(main,tzap);

Фишка в том, что файл, открытый по ресету, можно как читать, так и записывать.

А кто запись будет удалять? В твоем примере все записи просто сдвинутся.

Анжелика, передавай процедуре del еще один рараметр - отредактированную запись.
И поменяй цикл
     repeat
              if k<>i-1 then
                 begin                
                         read(osnF,zap);
                         write(temp,zap);
                  end
              else write(temp,{отредактированная запись});
           inc(k);
     until eof(osnF);


и тут
procedure exchange;
{-------------------------------------------}
     if (name='y') or(name='Y')
     then
     begin
          del(main,i);
          write(main,tzap){-------убери эту строку-------}
     end

{-------------------------------------------}



Так отредактированная запись останется на своем месте yes2.gif
Бродяжник
И что куда сдвинется? Поясните, plz.
program exchg;
uses crt;
var f: file of byte;
    i,b: byte;
begin

 clrscr;

 {-- creating the file --}

 assign(f,'proba');
 rewrite(f);

 for b:=1 to 10 do write(f,b);

 {-- reporting the file size --}

 writeln('File size = ', FileSize(f));

 close(f);

 reset(f);

 {-- reading one record --}

 seek(f,4);
 read(f,b);

 writeln('Byte read: ',b);

 {-- changing it's value --}

 b := 128;

 {-- rewriting the record --}

 seek(f,4);
 write(f,b);

 writeln('Byte written: ',b);

 {-- reading the record again --}

 seek(f,4);
 read(f,b);

 writeln('Byte read again: ',b);

 {-- again reporting the file size --}

 writeln('File size after changing = ', FileSize(f));

 {-- listing all records --}

 reset(f);

 for i:=1 to FileSize(f) do
   begin
     read(f,b);
     writeln('(',i:2,')',b:4);
   end;

 close(f);

end.
Анжелика
Спасибо всем огромное. Очень помогли)
Bokul
Цитата
И что куда сдвинется?

Ты прав smile.gif , так на много проще...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.