Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Перезапись строки типизированного файла

Автор: Анжелика 29.05.2006 15:32

Всем привет! Ребят, помогите мне, пжл, изменить задачу. Тема такая: есть типизированный файл записей. Нужно изменить одну из записей этого файла. Программу я написала(см. код), но вот меняет она следующую строку, а не нужную. Подскажите, 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

Автор: Бродяжник 29.05.2006 15:53

Не усложняйте задачу.

seek(main,i-1);
read(main,tzap);
{... редактируем запись...}
seek(main,i-1);
write(main,tzap);

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

Автор: Bokul 30.05.2006 4:18

Цитата(Бродяжник @ 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

Автор: Бродяжник 30.05.2006 12:29

И что куда сдвинется? Поясните, 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.

Автор: Анжелика 30.05.2006 15:34

Спасибо всем огромное. Очень помогли)

Автор: Bokul 31.05.2006 3:23

Цитата
И что куда сдвинется?

Ты прав smile.gif , так на много проще...