Выполнить слияние двух рассортированных бинарных файлов в третий упорядоченный файл - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д