Слияние файлов в один
program Project1;
const
Fn1 = 'file1.txt';
Fn2 = 'file2.txt';
Fn3 = 'file3.txt';
N = 100;
var
F1, F2, F3 : Text;
i, j, k, Num : Integer;
Arr : array[1..N] of Integer;
begin
(*Связываем файловые переменные с файлами.*)
Assign(F1, Fn1);
Assign(F2, Fn2);
Assign(F3, Fn3);
(*Записываем в первые 2 файла числа по возрастанию.*)
(*В первый файл записываем чётные числа: 0..10.*)
Rewrite(F1);
i := 0;
while i <= 10 do begin
(*Перед записью очередного числа выполняем переход на следующую строку.
Это действие не выполняем только для самого первого числа.*)
if i > 0 then Writeln(F1);
Write(F1, i);
i := i + 2;
end;
(*Записываем в файл содержимое файлового буфера. Это действие
выполняется только для текстовых файлов.*)
Flush(F1);
(*Во второй файл записываем нечётные числа: 1..9.*)
Rewrite(F2);
i := 1;
while i <= 10 do begin
if i > 1 then Writeln(F2);
Write(F2, i);
i := i + 2;
end;
Flush(F2);
(*Открываем первый файл, читаем из него числа и записываем их в массив Arr.*)
Reset(F1);
i := 0;
while not Eof(F1) do begin
i := i + 1;
Read(F1, Arr[i]);
end;
(*Теперь выполняем слияние на массиве. Для этого откроем второй файл.
Будем последовательно читать из него числа и искать позицию в массиве,
куда можно вставить очередное прочитанное число. Далее, вставляем
число в массив. При этом, если требуется, будем сдвигать остальные числа
массива на одну позицию вправо - чтобы освободить место для вставки.*)
Reset(F2);
while not Eof(F2) do begin
(*Читаем очередное число из второго файла.*)
Readln(F2, Num);
(*Ищем позицию в массиве, на которой расположено число большее или равное
тому, которое прочитано из файла. Если такое число найдётся в массиве, тогда
j будет содержать индекс этого числа. Если такое число
не найдётся, тогда j окажется на 1 больше, чем i. - Т. е. j будет указывать
на место, расположенное после последнего значимого элемента массива.*)
j := 1;
while (j <= i) and (Arr[j] < Num) do begin
j := j + 1;
end;
if j > i then begin
(*Вставляем прочитанное из файла число справа от последнего значимого
элемента массива.*)
Arr[j] := Num;
end else begin
(*Сдвигаем элементы массива, расположенные в позициях i..j
на 1 позицию вправо.*)
for k := i downto j do begin
Arr[k + 1] := Arr[k];
end;
(*Вставляем на освободившуюся позицию прочитанное из файла число.*)
Arr[j] := Num;
end;
(*Т. к. мы добавили в массив новое число, то количество значимых элементов
массива увеличилось на единицу.*)
i := i + 1;
end;
(*Теперь записываем элементы массива в третий файл.*)
Rewrite(F3);
for j := 1 to i do begin
if j > 1 then Writeln(F3);
Write(F3, Arr[j]);
end;
(*Так как далее следует закрытие файлов, то Flush() в данном случае
выполнять не обязательно.*)
Flush(F3);
Close(F1);
Close(F2);
Close(F3);
Writeln('Задача выполнена. Результаты записаны в файлы:');
Writeln(Fn1, ', ', Fn2, ', ', Fn3);
Readln;
end.
Комментарии:
Нету комментариев для вывода...