Выполнить слияние двух рассортированных бинарных файлов в третий упорядоченный файл - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток!!!! У меня есть следующая задача - Выполнить слияние двух рассортированных бинарных файлов в третий упорядоченный файл. Сортировок не использовать. Дополнительных массивов и файлов не использовать. В процессе работы пришел к тому что это можно сделать, если находить в каждом из файлов минимальный элемент, потом сравнивать 2 минимальных и записывать в третий файл в порядке возрастания. Далее аналогично, НО - есть проблемка - как организовать поиск минимума в файле через пользовательскую функцию, чтобы при последующей итерации не учитывались предыдущие найденные минимумы. Так ни к чему и не пришел, по-этому написал программу, которая работает через 2 промежуточных массива. Если есть мысли то буду рад помощи. Листинг ниже
#include<stdio.h>
#include<conio.h>
 
int minimum_ind(int m1[])          //прототип функции поиска      
{     
     int min_ind=0; 
  for(int i=1;i<5;i++){          //поиск минимального элемента
       if (m1[min_ind]>m1[i]) min_ind = i;
    }
     return min_ind;
 }
//основная программа
int _tmain(int argc, _TCHAR* argv[]){
FILE *f1,*f2,*f3;
   int i1,i2,min1,min2,i=0,k;//min - переменная для поиска минимального элемента массива
   int m1[5]={91,82,23,77,5},m2[5]={6,13,4,5,7},temp_1[5],temp_2[5];
      if(!(f1=fopen("f1.txt","w+"))||
         !(f2=fopen("f2.txt","w+"))||
         !(f3=fopen("f3.txt","w+")))
           { puts("ошибка открытия файла");
      return 0;
   } 
   for(k=0;k<5;k++){ //работа с копией массива
    temp_1[k]=m1[k];
     temp_2[k]=m2[k];
   }
   fwrite(m1,sizeof(int),sizeof(m1)/sizeof(int),f1);   // запись m1 в файл f1
   fwrite(m2,sizeof(int),sizeof(m2)/sizeof(int),f2);   // запись m2 в файл f2
   rewind(f1); //позиционирование в начало файла
   rewind(f2);
 //процедура сравнения минимумов и записи их в порядке возрастания. Значения берутся из дубликата массивов
  for(k=0;k<10;k++){
   min1=minimum_ind(temp_1); //получение миним.элемента из 1 массива
    min2=minimum_ind(temp_2);//получ.минм.элемента из 2 массива
     if(temp_1[min1] > temp_2[min2]){ fprintf(f3,"%d",temp_2[min2]); //вывести в бинарный файл
    temp_2[min2]=999;}
   else {fprintf(f3,"%d",temp_1[min1]); //вывести в бинарный файл
  temp_1[min1]=999;}
}
fclose(f3);
f3=fopen("f3.txt","r");
while(!feof(f3)){
fread(&i1,sizeof(int),1,f3);
printf("%5d= ",i1);
}
fclose(f1);
fclose(f2);
fclose(f3);
printf("File write!");
getch();
return 0;
}

Решение задачи: «Выполнить слияние двух рассортированных бинарных файлов в третий упорядоченный файл»

textual
Листинг программы
struct data {
   int data;
   char flag;
};

Объяснение кода листинга программы

  1. Объявляется структура данных data, которая содержит поля data и flag.
  2. В блоке main() объявляются следующие переменные:   a. file1 и file2 - указатели на файлы, с которыми будет производиться работа.   b. result - указатель на файл, в который будет записываться результат.   c. buffer - буфер для чтения данных из файлов.   d. temp - временная переменная для хранения значения поля flag.
  3. Производится чтение данных из файлов file1 и file2 в буфер buffer.
  4. Если буфер buffer содержит данные из обоих файлов, то:   a. Записывается значение поля data из буфера в файл result.   b. Записывается значение поля flag из буфера в переменную temp.
  5. Если буфер buffer содержит данные только из одного файла, то:   a. Записывается значение поля data из буфера в файл result.
  6. Если буфер buffer пуст, то:   a. Записывается значение поля flag из буфера в файл result.
  7. Производится закрытие файлов file1, file2 и result.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.4 из 5
Похожие ответы