Задача: В типизированном файле поменять местами две записи. То есть дан номер маршрута Marshrut.NK.N, количество остановок до метро Marshrut.NK.K. Надо найти маршрут 11 и поменять его местами со след записью. Вот часть кода име...
Задача: В типизированном файле поменять местами две записи.
То есть дан номер маршрута Marshrut.NK.N, количество остановок до метро Marshrut.NK.K. Надо найти маршрут 11 и поменять его местами со след записью. Вот часть кода именной этой процедуры, помогите с сортировкой т.к. та, которая написана ниже не робит.
var
Marshrut, y: TMarshrut;
Vidtransporta: TVidtransporta;
fr: file of TMarshrut;
n, kol, k: integer;
FileName:string[80];
begin
while not eof(fr) and (kol=0) do
begin
read(fr, Marshrut);
if (Marshrut.NK.N = '11') then
begin
writeln('Маршрут: ',Marshrut.NK.N,
' Количество остановок до метро: ',Marshrut.NK.K);
inc(kol);
k:=FilePos(fr)-1;
y:=FilePos(fr);
seek (fr, 0);
write (fr, y);
seek (fr, 1);
write (fr, k);
write('В файле изменена запись номер', k+1);
write(fr, Marshrut);
end;
end;
if kol=0 then
writeln('Данные, соответствующие запросу, не найдены');
CloseFile(fr);
write('Press ENTER'); readln;
end;
Ответ(ы) на вопрос:
Гость
поясни по нормальней
Гость
Здесь нужно использовать вспомогательный типизированный файл и, соответственно, вторую файловую переменную (fr2).
Сделать это можно так:
while not eof(fr) and (kol=0) do
begin
read(fr, Marshrut);
if (Marshrut.NK.N <> '11')
then write(fr2,Marshrut)
else begin inc(kol); y:=Marshrut; end;
end;
if not eof(fr) then
begin
read(fr, Marshrut);
write(fr2,Marshrut);
end;
if (kol=1) then write(fr2,y);
Дальше нужно просто переписать оставшиеся записи из первого файла во второй. Затем оба файла закрыть, первый файл удалить, а второй переименовать (т.е. назвать его так, как назывался первый файл).
Попробуйте ещё вот такой вариант:
(здесь k1 и k2 - целые, а y - типа )
if (Marshrut.NK.N = '11') then
begin
writeln('... ');
inc(kol);
y:=Marshrut;
k1:=FilePos(fr)-1;
k2:=FilePos(fr);
if not eof(fr) then
begin
read(fr, Marshrut);
seek (fr, k1);
write(fr, Marshrut);
seek (fr, k2);
write (fr, y);
end;
end;
Не нашли ответ?
Похожие вопросы