Как сделать так, что бы сортировать текстовых файл на С?

Для сортировки текстового файла на языке программирования C можно использовать алгоритм сортировки слиянием (Merge Sort). Данный алгоритм обеспечивает стабильную сортировку и имеет сложность O(n log n), где n - количество элементов, которые нужно отсортировать.

Для начала, вам потребуется функция для чтения текстового файла и сохранения его строк в массив. Вы можете использовать функцию fopen и fgets для этого. Например:

#include <stdio.h>
#include <string.h>

#define MAX_LENGTH 1000
#define MAX_LINES 1000

int read_file(char* filename, char lines[MAX_LINES][MAX_LENGTH]) {
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        printf("Невозможно открыть файлn");
        return -1;
    }

    int line_count = 0;
    while (fgets(lines[line_count], MAX_LENGTH, file) != NULL) {
        line_count++;
    }

    fclose(file);
    return line_count;
}

Далее, вам понадобится функция для записи отсортированных строк обратно в файл. Вы можете использовать функцию fopen и fputs для этого. Например:

void write_file(char* filename, char lines[MAX_LINES][MAX_LENGTH], int line_count) {
    FILE* file = fopen(filename, "w");
    if (file == NULL) {
        printf("Невозможно открыть файл для записиn");
        return;
    }

    for (int i = 0; i < line_count; i++) {
        fputs(lines[i], file);
    }

    fclose(file);
}

Теперь, основное внимание уделяется самому алгоритму сортировки. Ниже приведена реализация сортировки слиянием:

void merge(char lines[MAX_LINES][MAX_LENGTH], int left, int mid, int right) {
    int i, j, k;
    int n1 = mid - left + 1;
    int n2 = right - mid;

    char left_temp[MAX_LINES][MAX_LENGTH];
    char right_temp[MAX_LINES][MAX_LENGTH];

    for (i = 0; i < n1; i++) {
        strcpy(left_temp[i], lines[left + i]);
    }
    for (j = 0; j < n2; j++) {
        strcpy(right_temp[j], lines[mid + 1 + j]);
    }

    i = 0;
    j = 0;
    k = left;

    while (i < n1 && j < n2) {
        if (strcmp(left_temp[i], right_temp[j]) <= 0) {
            strcpy(lines[k], left_temp[i]);
            i++;
        } else {
            strcpy(lines[k], right_temp[j]);
            j++;
        }
        k++;
    }

    while (i < n1) {
        strcpy(lines[k], left_temp[i]);
        i++;
        k++;
    }

    while (j < n2) {
        strcpy(lines[k], right_temp[j]);
        j++;
        k++;
    }
}

void merge_sort(char lines[MAX_LINES][MAX_LENGTH], int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;

        merge_sort(lines, left, mid);
        merge_sort(lines, mid + 1, right);

        merge(lines, left, mid, right);
    }
}

Наконец, чтобы вызвать функции и выполнить сортировку файла, вы можете использовать следующий код:

int main() {
    char lines[MAX_LINES][MAX_LENGTH];
    char filename[] = "input.txt";

    int line_count = read_file(filename, lines);
    if (line_count == -1) {
        return 1;
    }

    merge_sort(lines, 0, line_count - 1);

    write_file(filename, lines, line_count);

    printf("Файл успешно отсортированn");

    return 0;
}

В данном примере предполагается, что исходный текстовый файл называется "input.txt" и находится в той же папке, где находится исполняемый файл программы. Отсортированный файл будет перезаписан с тем же именем.

Обратите внимание, что в данном примере были использованы фиксированный размер массива строк MAX_LINES и фиксированный размер каждой строки MAX_LENGTH. Вы можете адаптировать эти значения под свои потребности.

Это только один из возможных способов сортировки текстового файла на языке C. Другие возможности включают использование алгоритма быстрой сортировки (Quick Sort) или алгоритма сортировки вставкой (Insertion Sort) в зависимости от ваших требований. Но алгоритм сортировки слиянием является одним из наиболее эффективных и удобных для сортировки большого количества данных.