Advertisement
Guest User

Untitled

a guest
Dec 26th, 2011
175
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <memory.h>
  6. using namespace std;
  7. typedef struct item
  8. {
  9.     int key;
  10.     char name[60];
  11. };
  12. /* двухфазная сортировка, параметр - имя файла*/
  13. int vnsort1(char *ff); // фаза разделения серий
  14. int vnsort2(char *a); // фаза слияния
  15.  
  16. int vnsort1( char *ff )
  17. {
  18.     FILE *A,*B,*C; /* файловые переменные */
  19.     /* файлы "B", "C" в функциях - временные */
  20.     item *a1 = new item; /* для чтения из исходного файла */
  21.     item *a2 = new item; /* для чтения из исходного файла */
  22.     int pb,pc; /* признаки записи в файлы разделения */
  23.     int p; /* p=1 - признак достижения конца исходного файла */
  24.     while(1)  /* цикл 1, цикл повторения фаз разделения и слияния */
  25.     /* Подготовительные операции */
  26.     {
  27.         if ((A=fopen(ff,"r")) == NULL)
  28.     {
  29.         printf("\n Файл %s не открывается",ff);
  30.         getch();
  31.         return -1;
  32.     }
  33.         if ((B=fopen("B","w")) == NULL)
  34.     {
  35.         printf("\n Файл B не открывается");
  36.         getch();
  37.         return -1;
  38.     }
  39.         if ((C=fopen("C","w")) == NULL)
  40.     {
  41.         printf("\n Файл C не открывается");
  42.         getch();
  43.         return -1;
  44.     }
  45.     p = 0;
  46.     pb = 0;
  47.     pc = 0;
  48.         //if(fscanf(A, "%d", &a1) == EOF)
  49.         if(fread(a1, sizeof (item),1, A) == NULL)
  50.     {
  51.         printf("\n Сортируемый файл - пустой");
  52.         getch();
  53.         return -1;
  54.     }
  55.         else
  56.     {
  57.         //fprintf(B, " %d", a1);
  58.         fwrite(a1,sizeof(item),  1, B);
  59.         pb=1;
  60.     }
  61.        while(1) /* цикл 2, цикл формирования серий в файлах В и С */
  62.        {
  63.            while (1) /* цикл 3, цикл формирования серии в файле В */
  64.        {
  65.            //if(fscanf(A, "%d", &a2) == EOF)
  66.            if(fread(a2, sizeof (item),1, A) == NULL)
  67.            {
  68.                p=1; break; /* выход из цикла 3 */
  69.            }
  70.            else
  71.            {
  72.                if (a2->key>=a1->key)  /* запишем в серию в файле В */
  73.            {
  74.                //fprintf(B, " %d", a2);
  75.                fwrite(a2,sizeof(item),  1, B);
  76.                //a1=a2;
  77.                memcpy(a1,a2,sizeof(item));
  78.                pb=1;
  79.                continue;
  80.            }
  81.            else /* запишем первую запись новой серии в файле С */
  82.            {
  83.                //fprintf(C, " %d", a2);
  84.                fwrite(a2,sizeof(item),  1, C);
  85.                //a1=a2;
  86.                memcpy(a1,a2,sizeof(item));
  87.                pc=1;
  88.                break; /* выход из цикла 3 */
  89.            }
  90.            }
  91.         }
  92.         if (p)
  93.             break;  /* выход из цикла 2 */
  94.             while (1) /* цикл 4, формирование серии в файле С */
  95.         {
  96.             //if(fscanf(A, "%d", &a2) == EOF)
  97.             if(fread(a2, sizeof (item),1, A) == NULL)
  98.         {
  99.             p=1;
  100.             break; /* выход из цикла 4 */
  101.         }
  102.             else
  103.         {
  104.             if (a2->key >= a1->key)  /* запишем в серию в файле С */
  105.             {
  106.                 //fprintf(C, " %d", a2);
  107.                 fwrite(a2,sizeof(item),  1, C);
  108.                 //a1=a2;
  109.                 memcpy(a1,a2,sizeof(item));
  110.                 pc=1;
  111.             continue;
  112.             }
  113.             else
  114.             {
  115.                 //fprintf(B, " %d", a2);
  116.                 fwrite(a2,sizeof(item),  1, B);
  117.                 //a1=a2;
  118.                 memcpy(a1,a2,sizeof(item));
  119.                 pb=1;
  120.             break; /* выход из цикла 4 */
  121.             }
  122.         }
  123.         }
  124.         if (p)
  125.            break; /* выход из цикла 2 */
  126.         }
  127.     fclose(A);
  128.     fclose(B);
  129.     fclose(C);
  130.     if (pb && pc)  /* исходный файл записан в оба файла разделения */
  131.         vnsort2(ff);  /* вызов функции слияния */
  132.     else
  133.     { /* Удаление вспомогательных файлов */
  134.         remove("B"); remove("C");
  135.         return 0;  /* конец сортировки */
  136.     }
  137.     }
  138. }
  139.  
  140. int vnsort2(char *a)
  141. {
  142.     bool flag;
  143.     FILE *A,*B,*C; /* файловые переменные */
  144.         item *b1,*b2,*c1,*c2; /* для считывания данных из файлов В и С */
  145.     b1 = new item;
  146.     b2 = new item;
  147.     c1 = new item;
  148.     c2 = new item;
  149.     int rb,rc; /* коды завершения операции считывания из файлов В и С*/
  150.     /* Подготовительные операции */
  151.     if ((A=fopen(a,"w")) == NULL)
  152.     {
  153.         printf("\n Файл %s не открывается",a);
  154.     getch();
  155.     return -1;
  156.     }
  157.     if ((B=fopen("B","r")) == NULL)
  158.     {
  159.         printf("\n Файл B не открывается");
  160.     getch();
  161.     return -1;
  162.     }
  163.     if ((C=fopen("C","r")) == NULL)
  164.     {
  165.         printf("\n Файл C не открывается");
  166.     getch();
  167.     return -1;
  168.     }
  169.     //rb = fscanf(B,"%d", &b2);
  170.     //rc=fscanf(C,"%d",&c2);
  171.     rb = fread(b2, sizeof (item),1, B);
  172.     rc = fread(c2, sizeof (item),1, C);
  173.     memcpy(b1,b2,sizeof(item));
  174.     memcpy(c1,c2,sizeof(item));
  175.     //b1=b2;
  176.     //c1=c2;
  177.     while (1)
  178.     {
  179.         if ( (rb > 0) && (rc <= 0) )    // файл С закончился
  180.         {
  181.        // fprintf(A," %d",b2);
  182.        //while (fscanf(B,"%d",&b2) >0)
  183.         //fprintf(A," %d",b2);
  184.         fwrite(b2,sizeof(item),  1, A);
  185.  
  186.             while (fread(b2, sizeof (item),1, B))
  187.                 fwrite(b2,sizeof(item),  1, A);
  188.         fclose(A);
  189.         fclose(B);
  190.         fclose(C);
  191.         return 0;
  192.         }
  193.         else if ( (rb <= 0) && (rc > 0) ) // файл B закончился
  194.         {
  195.         //fprintf(A," %d",c2);
  196.         //while (fscanf(C,"%d",&c2) >0)
  197.             //fprintf(A," %d",c2);
  198.         fwrite(c2,sizeof(item),  1, A);
  199.         while (fread(c2, sizeof (item),1, C))
  200.                 fwrite(c2,sizeof(item),  1, A);
  201.  
  202.         fclose(A);
  203.         fclose(B);
  204.         fclose(C);
  205.         return 0;
  206.         }
  207.         else if ( (rb <= 0) && (rc <= 0) ) // оба файла закончились
  208.         {
  209.         fclose(A);
  210.         fclose(B);
  211.         fclose(C);
  212.         return 0;
  213.         }
  214.  
  215.         if ( (b2->key >= b1->key) && (c2->key >= c1->key) ) /* обе сливаемые серии не исчерпаны */
  216.         {
  217.         if (b2->key <= c2->key)
  218.         {
  219.         //fprintf(A," %d",b2);
  220.         //b1=b2;
  221.         //rb=fscanf(B,"%d",&b2);
  222.  
  223.          fwrite(b2,sizeof(item),  1, A);
  224.          memcpy(b1,b2,sizeof(item));
  225.          rb = fread(b2, sizeof (item),1, B);
  226.         continue;
  227.         }
  228.         else
  229.         {
  230.             //fprintf(A," %d",c2);
  231.            // c1=c2;
  232.             //rc=fscanf(C,"%d",&c2);
  233.             fwrite(c2,sizeof(item),  1, A);
  234.             memcpy(c1,c2,sizeof(item));
  235.             rc=fread(c2, sizeof (item),1, C);
  236.         continue;
  237.         }
  238.         }
  239.  
  240.         if ( (b2->key >= b1->key) && (c2->key < c1->key) ) // серия файла C кончилась
  241.         {
  242.         //c1 = c2;
  243.          memcpy(c1,c2,sizeof(item));
  244.         flag = false;
  245.         do
  246.         {
  247.             //fprintf(A," %d",b2);
  248.            // b1 = b2;
  249.             //rb = fscanf(B,"%d",&b2);
  250.             fwrite(b2,sizeof(item),  1, A);
  251.             memcpy(b1,b2,sizeof(item));
  252.             rb=fread(b2, sizeof (item),1, B);
  253.             if( rb <= 0 )
  254.             {
  255.                 flag = true;
  256.                 break;
  257.             }
  258.             if( b2->key < b1->key )
  259.             {
  260.                     //b1 = b2;
  261.                     memcpy(b1,b2,sizeof(item));
  262.                     flag = true;
  263.                     break;
  264.             }
  265.             if ( flag == true )
  266.                 break;
  267.         } while(1);
  268.         if( flag == true )
  269.             continue;
  270.         }
  271.         if ( (b2->key < b1->key) && (c2->key >= c1->key) ) // серия файла B кончилась
  272.         {
  273.         //b1 = b2;
  274.         memcpy(b1,b2,sizeof(item));
  275.         flag = false;
  276.         do
  277.         {
  278.             //fprintf(A," %d",c2);
  279.             //c1 = c2;
  280.             //rc = fscanf(C,"%d",&c2);
  281.             fwrite(c2,sizeof(item),  1, A);
  282.             memcpy(c1,c2,sizeof(item));
  283.             rc=fread(c2, sizeof (item),1, C);
  284.             if( rc <= 0 )
  285.             {
  286.                 flag = true;
  287.                 break;
  288.             }
  289.             if( c2->key < c1->key )
  290.             {
  291.                     memcpy(c1,c2,sizeof(item));
  292.                     flag = true;
  293.                     break;
  294.             }
  295.             if ( flag == true )
  296.                 break;
  297.         } while (1);
  298.         if( flag == true )
  299.             continue;
  300.         }
  301.  
  302.     }
  303. }
  304.  
  305. void in()
  306. {
  307.     FILE * file;
  308.     file = fopen("test.dat", "wb");
  309.     item *items = new item[10];
  310.  
  311.     items[0].key = 9;
  312.     strcpy(items[0].name,"name9");
  313.     items[1].key = 11;
  314.     strcpy(items[1].name,"name11");
  315.     items[2].key = 2;
  316.     strcpy(items[2].name,"name2");
  317.     items[3].key = 6;
  318.     strcpy(items[3].name,"name6");
  319.     items[4].key = 10;
  320.     strcpy(items[4].name,"name10");
  321.     items[5].key = 7;
  322.     strcpy(items[5].name,"name7");
  323.  
  324.     fwrite(&items[0],sizeof(item),  1, file);
  325.     fwrite(&items[1],sizeof(item),  1, file);
  326.     fwrite(&items[2],sizeof(item),  1, file);
  327.     fwrite(&items[3],sizeof(item),  1, file);
  328.     fwrite(&items[4],sizeof(item),  1, file);
  329.     fwrite(&items[5],sizeof(item),  1, file);
  330.  
  331.     fclose(file);
  332. }
  333. void out ()
  334. {
  335.     FILE * file;
  336.     file = fopen("test.dat", "rb");
  337.     item *it = new item;
  338.     int i;
  339.     while (i=fread(it, sizeof (item),1, file))
  340.     {
  341.         cout<<"\nkey: "<<it->key<<"name: "<<it->name;
  342.     }
  343.     cout<<"\n";
  344.     fclose(file);
  345. }
  346. int main()
  347. {
  348.  
  349.     in();
  350.     out();
  351.     vnsort1("test.dat");
  352.     out();
  353.     cin.get();
  354.     return 0;
  355. }
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement