//Сортировочник
void DoSort(char * F_Name)
{
//Открытие бинарного файла
int TF01;
int sorted=0;
int intvalue1=0;
int intvalue2=0;
register int goto0;
register char *Str1="", *Str2="";

TF01 = open(F_Name, O_BINARY | O_RDWR);
if(!TF01)
	{
	pri("Ошибка открытия файла для проведения сортировки");
	if (!getch()) getch();
	exit(5);
	}

//Расчет объема файла в байтах
SortEnd = filelength(TF01);//Конечная структура
SortCur=0;//Курсор выбора целевой структуры для подмены
SortIns=0;//Структура, ожидаемая подмены


//Меню выбора поля для сотрировки
printf("\n\n");
p_header_s();
	cout << '║' << setiosflags(ios::left)<<
	setw(10) << 1 << '║' <<
	setw(10) << 2 << '║' <<
	setw(14) << 3 << "║" <<
	setw(15) << 4 << "║" <<
	setw(13) << 5 << "║\n";
	cout << header[5] << e;

textcolor(5);
cprintf("Пожалуйста, выберите номер ключевого столбца сортировки:");
textcolor(7);
cprintf(" ");
SelectColomn:
presskey1=getch();
if (presskey1==27) goto DoExitFrSort;
if ((presskey1<'1')||(presskey1>'5')) {ErrSnd(); goto SelectColomn;}
if (presskey1=='1') goto0=2;
if (presskey1=='2') goto0=13;
if (presskey1=='3') goto0=24;
if (presskey1=='4') goto0=39;
if (presskey1=='5') goto0=55;
printf("%c", presskey1);
gotoxy(goto0+1, wherey()-2);
textcolor(10);
cprintf("√ ░▒▓█");
gotoxy(1, wherey()+3);
textcolor(7);
cprintf("\n\n");
cprintf(" \n\n");

//Суб-меню, выбора направления сотрировки (возрастание/убывание)
gotoxy(1, wherey());
printf("Как будем сортировать?\n\n");
textcolor(15);cprintf("1) I");textcolor(8);cprintf("n");
textcolor(7);
cprintf("  - по возрастанию\n"); //Поиск минимальных значений
gotoxy(1, wherey());
textcolor(15);cprintf("2) O");textcolor(8);cprintf("ut");
textcolor(7);
cprintf(" - по убыванию (!!!Может появиться вечный цикл)\n\n");
gotoxy(1, wherey());
printf("Введите соответствующую цифру: ");
SelectSortMEthod:
presskey4=getch();
if (presskey4==27) goto DoExitFrSort;

switch(presskey4)
{
case '1': case '2':
fout<< "\n\n              СОРТИРОВКА ДАННЫХ БИНАРНОГО ФАЙЛА:\n\n\
===========ДО СОРТИРОВКИ============================\n\n";

read_fs(1);

printf("%c\n\n", presskey4);
cprintf("\n");
printf("Идет сортировка...");
gotoxy(1, wherey()+1);

lseek(TF01, 0, SEEK_SET);
SortIns=0;
counter=0;
sorted=1;
while(sorted==1)
{
sorted=0;


lseek(TF01, 0, SEEK_SET);
	for(long SortCur=0; SortCur<SortEnd-z; SortCur+=z)
	{
	    lseek(TF01, SortCur, SEEK_SET);
	    if (tell(TF01)==SortEnd) break;
	    read(TF01, (char *)&sort01, z);
	    read(TF01, (char *)&sort02, z);
	    //Фильтры для строковых значений
	    if (presskey1=='1')
	    {
	      strcpy(Str1, sort01.s_name);
	      strcpy(Str2, sort02.s_name);
	    }
	    if (presskey1=='2')
	    {
	      strcpy(Str1, sort01.FN_trainer);
	      strcpy(Str2, sort02.FN_trainer);
	    }

	    if (presskey1=='3')
	    {
	      intvalue1=sort01.delay_tr;
	      intvalue2=sort02.delay_tr;
	    }

	    if (presskey1=='4')
	    {
	      intvalue1=sort01.cost_ts;
	      intvalue2=sort02.cost_ts;
	    }

	    if (presskey1=='5')
	    {
	      intvalue1=sort01.sprtmen_q;
	      intvalue2=sort02.sprtmen_q;
	    }

	    if ((presskey1=='1')||(presskey1=='2'))
	    {
	    if(strcmp(Str1, Str2))
	     if(((presskey4=='1')&&(strcmp(Str1, Str2)>0))||
	       ((presskey4=='2')&&(strcmp(Str2, Str1)>0)))
	     {
	      lseek(TF01, SortCur, SEEK_SET);
	      write(TF01, (char*)&sort02, z);
	      write(TF01, (char*)&sort01, z);
	      sorted=1;
	      //cout << e << "Шаг.";
	     }
	    }
	    else
	    {
	    if(intvalue1!=intvalue2)
	     if(((presskey4=='1')&&(intvalue1>intvalue2))||
		((presskey4=='2')&&(intvalue1<intvalue2)))
	      {
	      lseek(TF01, SortCur, SEEK_SET);
	      write(TF01, (char*)&sort02, z);
	      write(TF01, (char*)&sort01, z);
	      sorted=1;
	      }
	    }

	    counter++;
	    //cout << e << counter;
	}
if (counter>9999) break;
}
fout << "\n===============================================\
	 \nСортировка по ";
if(presskey1=='1')
fout << "Названию секции";
else
if(presskey1=='2')
fout << "ФИО тренера";
else if(presskey1=='3')
fout << "Дительности тренировки";
else if(presskey1=='4')
fout << "Стоимости занятия";
else if(presskey1=='5')
fout << "Количеству спортсменов в секции";

if (presskey4=='1')
fout << " по возрастанию\n\n";
else
fout << " по убыванию\n\n";
fout << "===========ПОСЛЕ СОРТИРОВКИ=========================\n\n";

printf("\n\n%i шагов - Сортировка окончена!\n\nРезультат сортировки:\n\n", counter);
break;

default:
ErrSnd();
goto SelectSortMEthod;
}
DoExitFrSort:
close(TF01);
}
