Advertisement
Guest User

Untitled

a guest
May 24th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5.  
  6. #define CORRECT_ENDING 0
  7. #define WRONG_ARGUMENTS_NUMBER -1
  8. #define FILE_NOT_FOUND -2
  9. #define EMPTY_FILE -3
  10. #define UNKNOWN_ARGUMENT -4
  11. #define FILE_OVERRUN -5
  12.  
  13. #define fd FILE
  14. #define END -1
  15.  
  16. int get_number_by_pos(fd *f, int pos)
  17. {
  18. int number;
  19.  
  20. fseek(f, (pos + 1) * sizeof(int), SEEK_SET);
  21. fread(&number, sizeof(int), 1, f);
  22.  
  23. return number;
  24. }
  25.  
  26. void put_number_by_pos(fd *f, int pos, int val)
  27. {
  28. fseek(f, (pos + 1) * sizeof(int), SEEK_SET);
  29. fwrite(&val, sizeof(int), 1, f);
  30. }
  31.  
  32. void quicksort_file(fd *f, size_t start, size_t finish)
  33. {
  34. int mid, temp;
  35.  
  36. size_t i = start;
  37. size_t j = finish;
  38.  
  39. if (finish == END)
  40. {
  41. fread(&finish, sizeof(int), 1, f);
  42. }
  43.  
  44. mid = get_number_by_pos(f, finish/2);
  45.  
  46. do
  47. {
  48. while (get_number_by_pos(f, i) < mid)
  49. {
  50. i++;
  51. }
  52. while (get_number_by_pos(f, j) > mid)
  53. {
  54. j--;
  55. }
  56.  
  57. if (i <= j)
  58. {
  59. if (get_number_by_pos(f, i) > get_number_by_pos(f, j))
  60. {
  61. temp = get_number_by_pos(f, i);
  62. put_number_by_pos(f, i, get_number_by_pos(f, j));
  63. put_number_by_pos(f, j, temp);
  64. }
  65. i++;
  66. if (j > 0)
  67. {
  68. j--;
  69. }
  70. }
  71. }
  72. while (i <= j);
  73.  
  74. if (i < finish)
  75. {
  76. quicksort_file(f, i, finish);
  77. }
  78.  
  79. if (j > start)
  80. {
  81. quicksort_file(f, start, j);
  82. }
  83.  
  84. fclose(f);
  85. }
  86.  
  87. int generate_file(char *filename)
  88. {
  89. fd *f;
  90. int number;
  91. int n;
  92.  
  93. setbuf(stdout, NULL);
  94. f = fopen(filename, "wb");
  95.  
  96. if (!f)
  97. {
  98. fprintf(stderr, "Error occured while opening file.\n");
  99. return FILE_NOT_FOUND;
  100. }
  101.  
  102. printf("Enter the number of integers:\n");
  103. scanf("%d", &n);
  104.  
  105. srand(time(0));
  106.  
  107. fwrite(&n, sizeof(int), 1, f);
  108.  
  109. for (int i = 0; i < n; i++)
  110. {
  111. number = rand() % 100;
  112. fwrite(&number, sizeof(int), 1, f);
  113. }
  114.  
  115. fclose(f);
  116.  
  117. return CORRECT_ENDING;
  118. }
  119.  
  120. int output_file(char *filename)
  121. {
  122. fd *f;
  123. int number;
  124. int rc = CORRECT_ENDING;
  125.  
  126. setbuf(stdout, NULL);
  127.  
  128. f = fopen(filename, "rb");
  129.  
  130. if (!f)
  131. {
  132. fprintf(stderr, "Matching file not found.\n");
  133. rc = FILE_NOT_FOUND;
  134. }
  135.  
  136. while (fread(&number, sizeof(int), 1, f))
  137. {
  138. printf("%d ", number);
  139. }
  140.  
  141. fclose(f);
  142.  
  143. return rc;
  144. }
  145.  
  146. int main(int argc, char** argv)
  147. {
  148. int rc;
  149.  
  150. if (argc != 3)
  151. {
  152. fprintf(stderr, "Wrong number of arguments.\n");
  153. return WRONG_ARGUMENTS_NUMBER;
  154. }
  155.  
  156.  
  157. if (strcmp(argv[1], "g") == 0)
  158. {
  159. rc = generate_file(argv[2]);
  160. }
  161.  
  162. else if (strcmp(argv[1], "p") == 0)
  163. {
  164. rc = output_file(argv[2]);
  165. }
  166.  
  167. else if (strcmp(argv[1], "s") == 0)
  168. {
  169. fd *f;
  170.  
  171. f = fopen(argv[2], "wb");
  172.  
  173. if (f == NULL)
  174. {
  175. return FILE_NOT_FOUND;
  176. }
  177.  
  178. quicksort_file(f, 0, END);
  179. rc = CORRECT_ENDING;
  180. }
  181.  
  182. else
  183. {
  184. rc = UNKNOWN_ARGUMENT;
  185. }
  186.  
  187.  
  188. if (rc != CORRECT_ENDING)
  189. switch (rc)
  190. {
  191.  
  192. case FILE_NOT_FOUND:
  193. {
  194. fprintf(stderr, "File is not found.\n");
  195. break;
  196. }
  197.  
  198. case EMPTY_FILE:
  199. {
  200. fprintf(stderr, "Executed file is empty.\n");
  201. break;
  202. }
  203.  
  204. case UNKNOWN_ARGUMENT:
  205. {
  206. fprintf(stderr, "Unknown argument.\n");
  207. break;
  208. }
  209.  
  210. }
  211. return rc;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement