Слияние файлов в один

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.
Теги:
слияние
Добавлено: 15 Сентября 2013 02:54:48 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...