Выполнить слияние двух рассортированных бинарных файлов в третий упорядоченный файл - 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;
};
Объяснение кода листинга программы
- Объявляется структура данных
data, которая содержит поляdataиflag. - В блоке main() объявляются следующие переменные:
a.
file1иfile2- указатели на файлы, с которыми будет производиться работа. b.result- указатель на файл, в который будет записываться результат. c.buffer- буфер для чтения данных из файлов. d.temp- временная переменная для хранения значения поляflag. - Производится чтение данных из файлов
file1иfile2в буферbuffer. - Если буфер
bufferсодержит данные из обоих файлов, то: a. Записывается значение поляdataиз буфера в файлresult. b. Записывается значение поляflagиз буфера в переменнуюtemp. - Если буфер
bufferсодержит данные только из одного файла, то: a. Записывается значение поляdataиз буфера в файлresult. - Если буфер
bufferпуст, то: a. Записывается значение поляflagиз буфера в файлresult. - Производится закрытие файлов
file1,file2иresult.