Advertisement
3axap_010

file_insertion_sort

Jun 16th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.96 KB | None | 0 0
  1. // file9.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. // Отсортировать текстовый файл методом вставок
  3.  
  4. #include "pch.h"
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. FILE* file_create(const char* filename, const char* mode)
  9. {
  10.     FILE* file = fopen(filename, mode);
  11.     if (!file)
  12.     {
  13.         fprintf(stderr, "Can't open file\n");
  14.         return NULL;
  15.     }
  16.  
  17.     return file;
  18. }
  19.  
  20. int get_int()
  21. {
  22.     int i, n;
  23.  
  24.     do
  25.     {
  26.         i = scanf_s("%d", &n);
  27.         if (!i)
  28.         {
  29.             rewind(stdin);
  30.             continue;
  31.         }
  32.     } while (!i);
  33.  
  34.     return n;
  35. }
  36.  
  37. void file_fill(FILE* file)
  38. {
  39.     int i;
  40.     fpos_t pos;
  41.  
  42.     for (;;)
  43.     {
  44.         fgetpos(file, &pos);
  45.  
  46.         i = get_int();
  47.  
  48.         if (i == 999)
  49.         {
  50.             return;
  51.         }
  52.  
  53.         fprintf(file, "%2d", i);
  54.  
  55.         fgetpos(file, &pos);
  56.     }
  57.  
  58.     printf("\n\n");
  59. }
  60.  
  61. void file_output(FILE* file)
  62. {
  63.     rewind(file);
  64.  
  65.     int i;
  66.  
  67.     while (1)
  68.     {
  69.         fscanf_s(file, "%d", &i);
  70.         fprintf(stdout, "%2d", i);
  71.  
  72.         if (feof(file) || ferror(file))
  73.         {
  74.             break;
  75.         }
  76.     }      
  77.  
  78.     fprintf(stdout, "\n");
  79. }
  80.  
  81. void file_sort(FILE* file)
  82. {
  83.     int i, j;
  84.  
  85.     fseek(file, 0, SEEK_END);
  86.     fpos_t end = ftell(file);
  87.     fpos_t inner, outer;
  88.  
  89.     for (inner = 2; inner < end; inner += 2)
  90.     {
  91.         fsetpos(file, &inner);
  92.         fscanf_s(file, "%d", &i);
  93.        
  94.         for (outer = inner - 2; outer >= 0; outer -= 2)
  95.         {          
  96.             fsetpos(file, &outer);
  97.             fscanf_s(file, "%d", &j);      
  98.  
  99.             fseek(file, 0, SEEK_CUR);
  100.  
  101.             if (j <= i)
  102.             {
  103.                 break;
  104.             }
  105.  
  106.             fprintf(file, "%2d", j);               
  107.             fsetpos(file, &outer);         
  108.         }
  109.        
  110.         fprintf(file, "%2d", i);
  111.     }
  112. }
  113.  
  114. void bin_file_fill(FILE* file)
  115. {
  116.     int i;
  117.  
  118.     for (;;)
  119.     {
  120.         i = get_int();
  121.  
  122.         if (i == 999)
  123.         {
  124.             break;
  125.         }
  126.  
  127.         fwrite(&i, sizeof(int), 1, file);
  128.     }
  129. }
  130.  
  131. void bin_file_output(FILE* file)
  132. {
  133.     rewind(file);
  134.  
  135.     int i;
  136.  
  137.     while (1)
  138.     {
  139.         fread(&i, sizeof(int), 1, file);
  140.         if (feof(file)) break;
  141.         fprintf(stdout, "%d ", i);
  142.     }
  143.  
  144.     fprintf(stdout, "\n");
  145. }
  146.  
  147. void bin_file_sort(FILE* file)
  148. {
  149.     int i, j;
  150.  
  151.     fseek(file, 0, SEEK_END);
  152.     fpos_t end = ftell(file);
  153.     fpos_t inner, outer;
  154.  
  155.     for (inner = sizeof(int); inner < end; inner += sizeof(int))
  156.     {
  157.         fsetpos(file, &inner);
  158.         fread(&i, sizeof(int), 1, file);
  159.  
  160.         for (outer = inner - sizeof(int); outer >= 0; outer -= sizeof(int))
  161.         {
  162.             fsetpos(file, &outer);
  163.             fread(&j, sizeof(int), 1, file);
  164.             fseek(file, 0, SEEK_CUR);
  165.  
  166.             if (j <= i)
  167.             {
  168.                 break;
  169.             }
  170.  
  171.             fwrite(&j, sizeof(int), 1, file);
  172.             fsetpos(file, &outer);
  173.         }
  174.  
  175.         fwrite(&i, sizeof(int), 1, file);
  176.     }
  177. }
  178.  
  179. int main()
  180. {
  181.     FILE* file = file_create("text.txt", "w+b");
  182.  
  183.     bin_file_fill(file);
  184.  
  185.     bin_file_output(file);
  186.  
  187.     bin_file_sort(file);
  188.  
  189.     bin_file_output(file);
  190.  
  191.     fclose(file);
  192.  
  193.     file = file_create("text.txt", "w+");
  194.    
  195.     file_fill(file);
  196.  
  197.     file_output(file);
  198.  
  199.     file_sort(file);
  200.  
  201.     file_output(file);
  202.  
  203.     fclose(file);
  204.  
  205.     system("PAUSE");
  206.     return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement