Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <string.h>
- #define CORRECT_ENDING 0
- #define WRONG_ARGUMENTS_NUMBER -1
- #define FILE_NOT_FOUND -2
- #define EMPTY_FILE -3
- #define UNKNOWN_ARGUMENT -4
- #define FILE_OVERRUN -5
- #define fd FILE
- #define END -1
- int get_number_by_pos(fd *f, int pos)
- {
- int number;
- fseek(f, (pos + 1) * sizeof(int), SEEK_SET);
- fread(&number, sizeof(int), 1, f);
- return number;
- }
- void put_number_by_pos(fd *f, int pos, int val)
- {
- fseek(f, (pos + 1) * sizeof(int), SEEK_SET);
- fwrite(&val, sizeof(int), 1, f);
- }
- void quicksort_file(fd *f, size_t start, size_t finish)
- {
- int mid, temp;
- size_t i = start;
- size_t j = finish;
- if (finish == END)
- {
- fread(&finish, sizeof(int), 1, f);
- }
- mid = get_number_by_pos(f, finish/2);
- do
- {
- while (get_number_by_pos(f, i) < mid)
- {
- i++;
- }
- while (get_number_by_pos(f, j) > mid)
- {
- j--;
- }
- if (i <= j)
- {
- if (get_number_by_pos(f, i) > get_number_by_pos(f, j))
- {
- temp = get_number_by_pos(f, i);
- put_number_by_pos(f, i, get_number_by_pos(f, j));
- put_number_by_pos(f, j, temp);
- }
- i++;
- if (j > 0)
- {
- j--;
- }
- }
- }
- while (i <= j);
- if (i < finish)
- {
- quicksort_file(f, i, finish);
- }
- if (j > start)
- {
- quicksort_file(f, start, j);
- }
- fclose(f);
- }
- int generate_file(char *filename)
- {
- fd *f;
- int number;
- int n;
- setbuf(stdout, NULL);
- f = fopen(filename, "wb");
- if (!f)
- {
- fprintf(stderr, "Error occured while opening file.\n");
- return FILE_NOT_FOUND;
- }
- printf("Enter the number of integers:\n");
- scanf("%d", &n);
- srand(time(0));
- fwrite(&n, sizeof(int), 1, f);
- for (int i = 0; i < n; i++)
- {
- number = rand() % 100;
- fwrite(&number, sizeof(int), 1, f);
- }
- fclose(f);
- return CORRECT_ENDING;
- }
- int output_file(char *filename)
- {
- fd *f;
- int number;
- int rc = CORRECT_ENDING;
- setbuf(stdout, NULL);
- f = fopen(filename, "rb");
- if (!f)
- {
- fprintf(stderr, "Matching file not found.\n");
- rc = FILE_NOT_FOUND;
- }
- while (fread(&number, sizeof(int), 1, f))
- {
- printf("%d ", number);
- }
- fclose(f);
- return rc;
- }
- int main(int argc, char** argv)
- {
- int rc;
- if (argc != 3)
- {
- fprintf(stderr, "Wrong number of arguments.\n");
- return WRONG_ARGUMENTS_NUMBER;
- }
- if (strcmp(argv[1], "g") == 0)
- {
- rc = generate_file(argv[2]);
- }
- else if (strcmp(argv[1], "p") == 0)
- {
- rc = output_file(argv[2]);
- }
- else if (strcmp(argv[1], "s") == 0)
- {
- fd *f;
- f = fopen(argv[2], "wb");
- if (f == NULL)
- {
- return FILE_NOT_FOUND;
- }
- quicksort_file(f, 0, END);
- rc = CORRECT_ENDING;
- }
- else
- {
- rc = UNKNOWN_ARGUMENT;
- }
- if (rc != CORRECT_ENDING)
- switch (rc)
- {
- case FILE_NOT_FOUND:
- {
- fprintf(stderr, "File is not found.\n");
- break;
- }
- case EMPTY_FILE:
- {
- fprintf(stderr, "Executed file is empty.\n");
- break;
- }
- case UNKNOWN_ARGUMENT:
- {
- fprintf(stderr, "Unknown argument.\n");
- break;
- }
- }
- return rc;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement