#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
FILE *in[5] ; // файлы, откуда мы считываем
FILE *out[5]; // файлы, куда мы записываем
char files [10][7] ={"t1", "t2", "t3", "t4","t5", "t6", "t7", "t8","t9", "t10"};
int c,i;
int n[5]; //массив первых элементов 5-ти выходных файлов
int k=0; // переменная отвечающая за индекс выходного файла (куда мы записываем)
int ks=0; // флаговая. отвечает за количество файлов, в которых записали серии после прохода
int number [10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int flags, flag[5];
int maxn, minn, a;
// 1-е разделение
in[0] = fopen("int1","rb"); // открытие начального файла с неупорядоченным массивом чисел
flags = !in[0];
for (i=0; i<5; i++)
{
out[i] = fopen(files[i+5],"wb"); // fopen в случае успеха вернет указатель. в случае не успеха- NULL
flags += !out[i];
}
if (flags) // проверяем все ли файлы открылись
{
perror ("Error open file");
_getch();
return 1;
}
fseek(in[0], 0, SEEK_END );
c=ftell(in[0])/(sizeof(int));
rewind(in[0]); // отмотка файла на начало
int temp1;
cout<<"Массив до сортировки: \n";
for(int i=0; i<c; i++)
{
fread(&temp1,sizeof(int),1, in[0]); // запись первого числа в файл
cout<<temp1<<" ";
}
cout<<endl;
rewind(in[0]); // отмотка файла на начало
fread(&n[1],sizeof(int),1,in[0]);
ks=0; k=0;
i=0;
while (i<c)
{
fwrite (&n[1],sizeof(int),1, out[k]); // запись первого числа в файл
while ( fread(&n[0],sizeof(int),1, in[0]) == 1 && n[0]>=n[1])
{
cout << n[0] << " ";
i++;
fwrite (&n[0],sizeof(int),1, out[k]);
n[1] = n[0];
}
i++;
n[1] = n[0];
ks++;
k = (k+1)%5; // цикличная запись в файл (карусель)
}
cout << endl;
fclose (in[0]); // закрываем все файлы после прохода
for (i=0; i<5; i++)
fclose (out[i]);
if (ks == 1)
{
printf ("File sorted");
_getch();
return 0;
}
do
{
for (i=0; i<10; i++)
number[i] = (number[i] + 5) % 10; // прокручиваем (карусель) файлы для открытия
flags = 0;
for (i=0; i<5; i++)
{
in[i] = fopen(files[number[i]],"rb");
out[i] = fopen(files[number[i+5]],"wb");
flags = flags || !in[i] || !out[i];
}
if (flags)
{
perror ("Error open file");
_getch();
return 1;
}
k = 0;
ks = 0;
flag[0] = fread (&n[0],sizeof(int),1, in[0]) == 1;
flags = flag[0];
a = n[0];
for (i=1; i<5; i++)
{
flag[i] = fread (&n[i],sizeof(int),1,in[i]) == 1;
flags += flag[i];
if (flag[i] && n[i]<a)
a = n[i]; // а- минимальное из первых чисел 5-ти файлов
}
while (flags>1)
{
for (i=0; !flag[i] ;i++); // находим первый файл, отличный от нуля (заполненый)
maxn = n[i];
for (i=i+1; i<5; i++)
if (flag[i] && maxn<n[i]) maxn = n[i];
if (maxn<a) // серия прерывается !!!!!!!!! а-последний записанный элемент в серию !!!!!!!!
{
ks++;
k = (k+1)%5;
for (i=0; !flag[i];i++);
minn = i;
for (i=i+1; i<5; i++)
if (flag[i] && n[minn]>n[i]) minn = i;
}
else // серия продолжается
{
for (i=0; !flag[i] || flag[i] && n[i]<a ;i++); // прокручиваем, ища нужный файл для записи
minn = i;
for (i=i+1; i<5; i++)
if (flag[i] && n[i]>=a && n[minn]>n[i]) minn = i; // выбираем минимальный из всех элементов больших уже записанного
}
fwrite (&n[minn],sizeof(int),1, out[k]);
a = n[minn];
flag[minn] = fread (&n[minn],sizeof(int),1, in[minn]) == 1; // переставляем курскор на сл. элемент после записанного
for (flags=i=0; i<5; i++) // пересчитывания кол-ва файлов
flags += flag[i];
}
for (i=0; i<5; i++) // находим тот единственный файл, который остался
if (flag[i]) flags = i;
if (n[flags]<a) // серия закончилось
{
ks++;
k = (k+1)%5;
}
fwrite(&n[flags], sizeof(int),1, out[k]);
while (fread (&n[flags],sizeof(int),1, in[flags]) == 1) // забиваем на хвост и не сортируем его по сериям, запихивая в последный выходной файл
fwrite (&n[flags],sizeof(int),1,out[k]);
ks++;
for (i=0; i<5; i++)
{
fclose (in[i]);
fclose (out[i]);
}
}
while (ks>1); // ks - кол-во выходных
int temp;
in[0] = fopen(files[number[k+5]],"rb");
fseek(in[0], 0, SEEK_END );
c=ftell(in[0])/(sizeof(int));
rewind(in[0]); // отмотка файла на начало
cout<<"Массив после сортировки: \n";
for(int i=0; i<c; i++)
{
fread(&temp,sizeof(int),1, in[0]); // запись первого числа в файл
cout<<temp<<" ";
}
cout<<endl;
printf ("Result file - %s\n", files[number[k+5]]);
_getch();
return 0;
}