Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Пваел
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 5
1

Выполнить слияние двух рассортированных бинарных файлов в третий упорядоченный файл

05.01.2010, 20:32. Просмотров 2001. Ответов 9
Метки нет (Все метки)

Доброго времени суток уважаемые форумчане!!!!

У меня есть следующая задача - Выполнить слияние двух рассортированных бинарных файлов в третий упорядоченный файл. Сортировок не использовать. Дополнительных массивов и файлов не использовать.

В процессе работы пришел к тому что это можно сделать, если находить в каждом из файлов минимальный элемент, потом сравнивать 2 минимальных и записывать в третий файл в порядке возрастания. Далее аналогично, НО - есть проблемка - как организовать поиск минимума в файле через пользовательскую функцию, чтобы при последующей итерации не учитывались предыдущие найденные минимумы.
Так ни к чему и не пришел, по-этому написал программу, которая работает через 2 промежуточных массива. Если есть мысли то буду рад помощи. Листинг ниже
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2010, 20:32
Ответы с готовыми решениями:

Из двух упорядоченных массивов составить третий упорядоченный массив
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; using namespace std; //...

Составить из значений двух массивов третий, также упорядоченный по возрастанию
7. Заданы два упорядоченных по возрастанию массива. Соста*вить из их значений третий, также...

Записать в третий файл строки из первых двух файлов, чтобы они тоже располагались по алфавиту
Задача: даны два файла, строки в которых расположены по алфавиту,записать в третий файл строки из...

Слияние двух упорядоченных по убыванию массивов в один, упорядоченный по убыванию
Даны два упорядоченных по убыванию массива W и G. Получите из них путем слияния упорядоченный по...

Даны два численных файла. Выполнить слияние этих файлов. Сохранить упорядоченно по возрастанию в третий файл исключая повторения
Добрый день. Прблемка следущая: я написал программку для слияния двух файлов в третий((((Даны два...

9
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.01.2010, 20:38 2
Цитата Сообщение от Пваел Посмотреть сообщение
чтобы при последующей итерации не учитывались предыдущие найденные минимумы
значение заворачиваешь в структуру, и добавляешь поле-флаг. если прочитанная структура удовлетворяет требованию, изменяешь флаг в файле.
0
Пваел
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 5
05.01.2010, 20:41  [ТС] 3
Извини но немного не понял - при поиске минимумов их значения будут записываться в структуру? А какой флаг добавлять в файл????
0
accept
4836 / 3258 / 464
Регистрация: 10.12.2008
Сообщений: 10,569
05.01.2010, 20:42 4
можно читать файлы и перематывать
по очереди просматривать файлы на минимальный элемент
когда он найден, записывать его в результирующий файл, элемент сохранять
искать следующий минимальный, который больше сохранённого
выход: когда минимальный элемент, который больше предыдущего минимального элемента, не найден, а файлы закончились
0
05.01.2010, 20:42
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.01.2010, 20:50 5
C
1
2
3
4
struct data {
   int data;
   char flag;
};
в файлы запиши структуры. а когда будешь искать, записывай в файл в поле flag значение, которое свидетельствует о том, что эта структура обработана.
0
Пваел
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 5
05.01.2010, 20:50  [ТС] 6
Если не затруднит можно кусок кода?

Смысл вроде понятен...но как

У меня так min1=minimum_ind(temp_1)
значения берутся из массива, а как переделать чтобы брались напрямую из файла????
0
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.01.2010, 21:01 7
Цитата Сообщение от Пваел Посмотреть сообщение
а как переделать чтобы брались напрямую из файла????
структуры одного размера. так и читай, последовательно, по одной.
0
Пваел
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 5
05.01.2010, 21:11  [ТС] 8
Цитата Сообщение от niXman Посмотреть сообщение
структуры одного размера. так и читай, последовательно, по одной.
Не согласен. Я не могу их читать по одной просто потому что если загнать в файл вместо массива структуры то все равно нужно искать минимальный элемент из всех структур.

Но вообще идея отличная - попробую реализовать, тему пока прошу не закрывать
0
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.01.2010, 21:18 9
Цитата Сообщение от Пваел Посмотреть сообщение
Я не могу их читать по одной просто потому что если загнать в файл вместо массива структуры то все равно нужно искать минимальный элемент из всех структур.
еще бы знаки препинания, и тебе бы цены не было

Добавлено через 2 минуты
Цитата Сообщение от Пваел Посмотреть сообщение
Но вообще идея отличная - попробую реализовать
реализовывал несколько раз. про код не спрашивай, не помню даже в каких проектах. зато помню что вместо чтения поэлементно, использовал отображение файла в память. так же, если файл не слишком большой, то можно его весь отсортировать простым использованием qsort() $)
0
odip
Эксперт С++
7167 / 3225 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
06.01.2010, 17:05 10
В процессе работы пришел к тому что это можно сделать, если находить в каждом из файлов минимальный элемент, потом сравнивать 2 минимальных и записывать в третий файл в порядке возрастания.
Этот метод называется сортировка слиянием.
Тебе нужно держать в памяти всего два элемента - один из 1-го файла и один из второго 2-го файл.
Сравниваешь два этих элемента.
Если меньше элемент из 1-го файла, то записываешь его в выходной файл и считываешь следующий элемент из 1-го файла.
Если меньше элемент из 2-го файла, то записываешь его в выходной файл и считываешь следующий элемент из 2-го файла.
Цикл останавливается если в одном из файлов закончились элементы.
Тогда нужно просто переписать хвост из другого файла в выходной файл.
Даю подсказку - все это тривиально.
0
06.01.2010, 17:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2010, 17:05

Слияние 2х файлов в третий файл
Составить программу сцепления двух файлов с созданием третьего файла Т.е. первый файл записывается...

Все числа, содержащиеся в двух бинарных файлах одновременно, переписать в третий файл
Создать два бинарных файла, все числа, содержащиеся в обоих файлах одновременно, переписать в...

Создать третий файл, упорядоченный по возрастанию, элементы которого являются элементами данных двух
дано два файла, содержащие упорядочены по возрастанию действительные числа. Создать третий,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru