Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <conio.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <memory.h>
- using namespace std;
- typedef struct item
- {
- int key;
- char name[60];
- };
- /* двухфазная сортировка, параметр - имя файла*/
- int vnsort1(char *ff); // фаза разделения серий
- int vnsort2(char *a); // фаза слияния
- int vnsort1( char *ff )
- {
- FILE *A,*B,*C; /* файловые переменные */
- /* файлы "B", "C" в функциях - временные */
- item *a1 = new item; /* для чтения из исходного файла */
- item *a2 = new item; /* для чтения из исходного файла */
- int pb,pc; /* признаки записи в файлы разделения */
- int p; /* p=1 - признак достижения конца исходного файла */
- while(1) /* цикл 1, цикл повторения фаз разделения и слияния */
- /* Подготовительные операции */
- {
- if ((A=fopen(ff,"r")) == NULL)
- {
- printf("\n Файл %s не открывается",ff);
- getch();
- return -1;
- }
- if ((B=fopen("B","w")) == NULL)
- {
- printf("\n Файл B не открывается");
- getch();
- return -1;
- }
- if ((C=fopen("C","w")) == NULL)
- {
- printf("\n Файл C не открывается");
- getch();
- return -1;
- }
- p = 0;
- pb = 0;
- pc = 0;
- //if(fscanf(A, "%d", &a1) == EOF)
- if(fread(a1, sizeof (item),1, A) == NULL)
- {
- printf("\n Сортируемый файл - пустой");
- getch();
- return -1;
- }
- else
- {
- //fprintf(B, " %d", a1);
- fwrite(a1,sizeof(item), 1, B);
- pb=1;
- }
- while(1) /* цикл 2, цикл формирования серий в файлах В и С */
- {
- while (1) /* цикл 3, цикл формирования серии в файле В */
- {
- //if(fscanf(A, "%d", &a2) == EOF)
- if(fread(a2, sizeof (item),1, A) == NULL)
- {
- p=1; break; /* выход из цикла 3 */
- }
- else
- {
- if (a2->key>=a1->key) /* запишем в серию в файле В */
- {
- //fprintf(B, " %d", a2);
- fwrite(a2,sizeof(item), 1, B);
- //a1=a2;
- memcpy(a1,a2,sizeof(item));
- pb=1;
- continue;
- }
- else /* запишем первую запись новой серии в файле С */
- {
- //fprintf(C, " %d", a2);
- fwrite(a2,sizeof(item), 1, C);
- //a1=a2;
- memcpy(a1,a2,sizeof(item));
- pc=1;
- break; /* выход из цикла 3 */
- }
- }
- }
- if (p)
- break; /* выход из цикла 2 */
- while (1) /* цикл 4, формирование серии в файле С */
- {
- //if(fscanf(A, "%d", &a2) == EOF)
- if(fread(a2, sizeof (item),1, A) == NULL)
- {
- p=1;
- break; /* выход из цикла 4 */
- }
- else
- {
- if (a2->key >= a1->key) /* запишем в серию в файле С */
- {
- //fprintf(C, " %d", a2);
- fwrite(a2,sizeof(item), 1, C);
- //a1=a2;
- memcpy(a1,a2,sizeof(item));
- pc=1;
- continue;
- }
- else
- {
- //fprintf(B, " %d", a2);
- fwrite(a2,sizeof(item), 1, B);
- //a1=a2;
- memcpy(a1,a2,sizeof(item));
- 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; /* конец сортировки */
- }
- }
- }
- int vnsort2(char *a)
- {
- bool flag;
- FILE *A,*B,*C; /* файловые переменные */
- item *b1,*b2,*c1,*c2; /* для считывания данных из файлов В и С */
- b1 = new item;
- b2 = new item;
- c1 = new item;
- c2 = new item;
- 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 = fscanf(B,"%d", &b2);
- //rc=fscanf(C,"%d",&c2);
- rb = fread(b2, sizeof (item),1, B);
- rc = fread(c2, sizeof (item),1, C);
- memcpy(b1,b2,sizeof(item));
- memcpy(c1,c2,sizeof(item));
- //b1=b2;
- //c1=c2;
- while (1)
- {
- if ( (rb > 0) && (rc <= 0) ) // файл С закончился
- {
- // fprintf(A," %d",b2);
- //while (fscanf(B,"%d",&b2) >0)
- //fprintf(A," %d",b2);
- fwrite(b2,sizeof(item), 1, A);
- while (fread(b2, sizeof (item),1, B))
- fwrite(b2,sizeof(item), 1, A);
- fclose(A);
- fclose(B);
- fclose(C);
- return 0;
- }
- else if ( (rb <= 0) && (rc > 0) ) // файл B закончился
- {
- //fprintf(A," %d",c2);
- //while (fscanf(C,"%d",&c2) >0)
- //fprintf(A," %d",c2);
- fwrite(c2,sizeof(item), 1, A);
- while (fread(c2, sizeof (item),1, C))
- fwrite(c2,sizeof(item), 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->key >= b1->key) && (c2->key >= c1->key) ) /* обе сливаемые серии не исчерпаны */
- {
- if (b2->key <= c2->key)
- {
- //fprintf(A," %d",b2);
- //b1=b2;
- //rb=fscanf(B,"%d",&b2);
- fwrite(b2,sizeof(item), 1, A);
- memcpy(b1,b2,sizeof(item));
- rb = fread(b2, sizeof (item),1, B);
- continue;
- }
- else
- {
- //fprintf(A," %d",c2);
- // c1=c2;
- //rc=fscanf(C,"%d",&c2);
- fwrite(c2,sizeof(item), 1, A);
- memcpy(c1,c2,sizeof(item));
- rc=fread(c2, sizeof (item),1, C);
- continue;
- }
- }
- if ( (b2->key >= b1->key) && (c2->key < c1->key) ) // серия файла C кончилась
- {
- //c1 = c2;
- memcpy(c1,c2,sizeof(item));
- flag = false;
- do
- {
- //fprintf(A," %d",b2);
- // b1 = b2;
- //rb = fscanf(B,"%d",&b2);
- fwrite(b2,sizeof(item), 1, A);
- memcpy(b1,b2,sizeof(item));
- rb=fread(b2, sizeof (item),1, B);
- if( rb <= 0 )
- {
- flag = true;
- break;
- }
- if( b2->key < b1->key )
- {
- //b1 = b2;
- memcpy(b1,b2,sizeof(item));
- flag = true;
- break;
- }
- if ( flag == true )
- break;
- } while(1);
- if( flag == true )
- continue;
- }
- if ( (b2->key < b1->key) && (c2->key >= c1->key) ) // серия файла B кончилась
- {
- //b1 = b2;
- memcpy(b1,b2,sizeof(item));
- flag = false;
- do
- {
- //fprintf(A," %d",c2);
- //c1 = c2;
- //rc = fscanf(C,"%d",&c2);
- fwrite(c2,sizeof(item), 1, A);
- memcpy(c1,c2,sizeof(item));
- rc=fread(c2, sizeof (item),1, C);
- if( rc <= 0 )
- {
- flag = true;
- break;
- }
- if( c2->key < c1->key )
- {
- memcpy(c1,c2,sizeof(item));
- flag = true;
- break;
- }
- if ( flag == true )
- break;
- } while (1);
- if( flag == true )
- continue;
- }
- }
- }
- void in()
- {
- FILE * file;
- file = fopen("test.dat", "wb");
- item *items = new item[10];
- items[0].key = 9;
- strcpy(items[0].name,"name9");
- items[1].key = 11;
- strcpy(items[1].name,"name11");
- items[2].key = 2;
- strcpy(items[2].name,"name2");
- items[3].key = 6;
- strcpy(items[3].name,"name6");
- items[4].key = 10;
- strcpy(items[4].name,"name10");
- items[5].key = 7;
- strcpy(items[5].name,"name7");
- fwrite(&items[0],sizeof(item), 1, file);
- fwrite(&items[1],sizeof(item), 1, file);
- fwrite(&items[2],sizeof(item), 1, file);
- fwrite(&items[3],sizeof(item), 1, file);
- fwrite(&items[4],sizeof(item), 1, file);
- fwrite(&items[5],sizeof(item), 1, file);
- fclose(file);
- }
- void out ()
- {
- FILE * file;
- file = fopen("test.dat", "rb");
- item *it = new item;
- int i;
- while (i=fread(it, sizeof (item),1, file))
- {
- cout<<"\nkey: "<<it->key<<"name: "<<it->name;
- }
- cout<<"\n";
- fclose(file);
- }
- int main()
- {
- in();
- out();
- vnsort1("test.dat");
- out();
- cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement