Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2009, 20:55   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию Сортировка слиянием файлов

Наткнулся в интернете на код, использующий сортировку слиянием текстовых файлов. решил переписать его, но для бинарных(структура состоит из имени char и параметра int), вот что получилось, прошу помочь в исправлении...
Код:
/* двухфазная сортировка, параметр - имя файла*/
int vnsort1(char *ff); // фаза разделения серий
int vnsort2(char *a); // фаза слияния
int vnsort1( char *ff )
{
    FILE *A,*B,*C; /* файловые переменные */
    /* файлы "B", "C" в функциях - временные */
    test a1,a2; /* для чтения из исходного файла */
    int pb,pc; /* признаки записи в файлы разделения */
    int p; /* p=1 - признак достижения конца исходного файла */
    while(1)  /* цикл 1, цикл повторения фаз разделения и слияния */
    /* Подготовительные операции */
    {
	if ((A=fopen(ff,"rb")) == NULL)
	{
	    printf("\n Файл %s не открывается",ff);
	    getch();
	    return -1;
	}
	if ((B=fopen("B","wb")) == NULL)
	{
	    printf("\n Файл B не открывается");
	    getch();
	    return -1;
	}
	if ((C=fopen("C","wb")) == NULL)
	{
	    printf("\n Файл C не открывается");
	    getch();
	    return -1;
	}
	p = 0;
	pb = 0;
	pc = 0;
	if(!fread(&a1,sizeof(a1),1,A))
	{
	    printf("\n Сортируемый файл - пустой");
	    getch();
	    return -1;
	}
	else
	{
	    fwrite(&a1,sizeof(a1),1,B);
	    pb=1;
	}
       while(1) /* цикл 2, цикл формирования серий в файлах В и С */
       {
	   while (1) /* цикл 3, цикл формирования серии в файле В */
	   {
	       if(!fread(&a2,sizeof(a2),1,A))
	       {
		   p=1; break; /* выход из цикла 3 */
	       }
	       else
	       {
		   if (strcmp(a2.name,a1.name)>=0)  /* запишем в серию в файле В */
		   {
		       fwrite(&a2,sizeof(a2),1,B);
		       a1=a2;
		       pb=1;
		       continue;
		   }
		   else /* запишем первую запись новой серии в файле С */
		   {
		       fwrite(&a2,sizeof(a2),1,C);
		       a1=a2;
		       pc=1;
		       break; /* выход из цикла 3 */
		   }
	       }
	    }
	    if (p)
		break;  /* выход из цикла 2 */
	    while (1) /* цикл 4, формирование серии в файле С */
	    {
		if(!fread(&a2,sizeof(a2),1,A))
		{
		    p=1;
		    break; /* выход из цикла 4 */
		}
		else
		{
		    if (strcmp(a2.name,a1.name)>=0)  /* запишем в серию в файле С */
		    {
			fwrite(&a2,sizeof(a2),1,C);
			a1=a2;
			pc=1;
			continue;
		    }
		    else
		    {
			fwrite(&a2,sizeof(a2),1,B);
			a1=a2;
			pb=1;
			break; /* выход из цикла 4 */
		    }
		}
	    }
	    if (p)
	       break; /* выход из цикла 2 */
	}
	fclose(A);
	fclose(B);
	fclose(C);
	if (pb && pc)  /* исходный файл записан в оба файла разделения */
	    vnsort2(ff);  /* вызов функции слияния */
	else
	{ /* Удаление вспомогательных файлов */
	    remove("B"); remove("C");
	    return 0;  /* конец сортировки */
	}
    }
}
[MI_nor] вне форума Ответить с цитированием
Старый 01.06.2009, 20:56   #2
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

2я ф-ия не уместилась пишу тут...
Код:
int vnsort2(char *a)
{
    int flag;
    FILE *A,*B,*C; /* файловые переменные */
    int b1,b2,c1,c2; /* для считывания данных из файлов В и С */
    int rb,rc; /* коды завершения операции считывания из файлов В и С*/
    /* Подготовительные операции */
    if ((A=fopen(a,"w")) == NULL)
    {
	printf("\n Файл %s не открывается",a);
	getch();
	return -1;
    }
    if ((B=fopen("B","r")) == NULL)
    {
	printf("\n Файл B не открывается");
	getch();
	return -1;
    }
    if ((C=fopen("C","r")) == NULL)
    {
	printf("\n Файл C не открывается");
	getch();
	return -1;
    }
    rb = fread(&b2,sizeof(b2),1,B);
    rc=fread(&c2,sizeof(b2),1,C);
    b1=b2;
    c1=c2;
    while (1)
    {
	if ( (rb > 0) && (rc <= 0) )    // файл С закончился
	{
	    fwrite(&b2,sizeof(b2),1,A);
	    while (fread(&b2,sizeof(b2),1,B) >0)
		fwrite(&b2,sizeof(b2),1,A);
	    fclose(A);
	    fclose(B);
	    fclose(C);
	    return 0;
	}
	else if ( (rb <= 0) && (rc > 0) ) // файл B закончился
	{
	    fwrite(&c2,sizeof(c2),1,A);
	    while (fread(&c2,sizeof(c2),1,C) >0)
		fwrite(&c2,sizeof(c2),1,A);
	    fclose(A);
	    fclose(B);
	    fclose(C);
	    return 0;
	}
	else if ( (rb <= 0) && (rc <= 0) ) // оба файла закончились
	{
	    fclose(A);
	    fclose(B);
	    fclose(C);
	    return 0;
	}

	if ( (b2 >= b1) && (c2 >= c1) ) /* обе сливаемые серии не исчерпаны */
	{
	    if (b2 <= c2)
	    {
		fwrite(&b2,sizeof(b2),1,A); b1=b2;
		rb=fread(&b2,sizeof(b2),1,B);
		continue;
	    }
	    else
	    {
		fwrite(&c2,sizeof(2),1,A);
		c1=c2;
		rc=fread(&c2,sizeof(c2),1,C);
		continue;
	    }
	}

	if ( (b2 >= b1) && (c2 < c1) ) // серия файла C кончилась
	{
	    c1 = c2;
	    flag = 0;
	    do
	    {
		fwrite(&b2,sizeof(b2),1,A);
		b1 = b2;
		rb = fread(&b2,sizeof(b2),1,B);
	        if( rb <= 0 )
	        {
		    flag = 1;
	            break;
	        }
	        if( b2 < b1 )
	        {
                    b1 = b2;
		    flag = 1;
		    break;
		}
		if ( flag == 1 )
	            break;
	    } while(1);
	    if( flag == 1 )
	        continue;
        }
        if ( (b2 < b1) && (c2 >= c1) ) // серия файла B кончилась
        {
	    b1 = b2;
	    flag = 0;
	    do
	    {
		fwrite(&c2,sizeof(c2),1,A);
		c1 = c2;
		rc = fread(&c2,sizeof(c2),1,C);
		if( rc <= 0 )
		{
		    flag = 1;
		    break;
		}
		if( c2 < c1 )
		{
		    c1 = c2;
		    flag = 1;
		    break;
		}
		if ( flag == 1 )
		    break;
	    } while (1);
	    if( flag == 1 )
		continue;
	}

    }
}
[MI_nor] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка двухфазным слиянием [MI_nor] Общие вопросы C/C++ 0 29.04.2009 23:27
сортировка естественным слиянием ArtFul777 Паскаль, Turbo Pascal, PascalABC.NET 1 18.11.2008 19:36