Сортировка чисел из файла .txt в C - PullRequest
0 голосов
/ 25 мая 2020

Я создал алгоритм сортировки, который работает нормально, когда числа, которые мне нужно отсортировать, находятся в массиве внутри кода, например:

int sort[] = {16,8,23,4,42,15};

Но мне нужен код для сортировки чисел из. txt, я знаю размер файла (поэтому нет необходимости в sizeof , чтобы знать, сколько чисел вам нужно отсортировать), но проблема в том, что числа в файле не разделяются запятыми, только пробелы, и я не знаю, как заставить мой код работать с этим списком чисел.

Мой код похож на этот, и, как я уже сказал, он работает, когда сортировочный массив чисел находится внутри кода через запятую:

int main(){

    int temp, size;
    int sort[] = {16,8,23,4,42,15};
    size = sizeof(sort) / sizeof(int);

    for(int j = 0; j < size; j++){
        for(int i = 0; i < size; i++){
            if(sort[i] > sort[i+1]){
                temp = sort[i];
                sort[i] = sort[i+1];
                sort[i+1] = temp;
            }
        }
    }

    for(int p = 0; p < size; p++){
        printf("%d ", sort[p]);
    }
}

И я также знаю, что для открытия файла в C код выглядит примерно так:

FILE* f;
f = fopen("1000.txt", "r");
if(f == 0){
    printf("Database unavaible or corrupted\n\n");
    exit(1);
}

Но я не знаю, что делать затем, как мне получить этот файл с несортированными числами, не разделенными запятыми, и заставить мой код отсортировать и распечатать их?

Ответы [ 2 ]

1 голос
/ 25 мая 2020

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

Код ниже представляет собой пример чтения чисел из файла:

#include <stdio.h>
#define MAX_NUM 10

int main() {
    FILE * fp = fopen("input.txt", "r");
    if(!fp) {return -1;}
    int array[MAX_NUM] = {0}; // you can use array[size] if you know exactly how many numbers in the file 
    int i = 0;
    while(i < MAX_NUM && fscanf(fp, "%d", &array[i]) == 1) {
        printf("a[%d] = %d\n", i, array[i]);
        i++;
    }

    // sort the array here as you did in your code
    return 0;
}

OT, в вашем коде есть ошибка в for l oop:

for(int i = 0; i < size; i++){
   if(sort[i] > sort[i+1]){...}
   ...
}

, когда i = size - 1, sort[i+1] станет sort[size], который находится вне массива sort, потому что максимальный индекс, к которому вы можете получить доступ, равен size-1, а не size. Он должен измениться на:

for(int j = 0; j < size; j++) {
    for(int i = 0; i < size-j-1; i++) {...}
}
0 голосов
/ 25 мая 2020

Для чтения чисел вы можете использовать fscanf, но у вас все еще есть проблема с распределением памяти.

Представьте, что файл имеет 20 элементов, но MAX_NUM равно 4096, вы бы взяли 4086 * 4 байта память без надобности. С другой стороны, в файле может быть 8000 элементов, но вы можете хранить только 4096. Что вы можете сделать, так это динамическое c распределение памяти.

int *array = (int*)malloc(10*sizeof(int));
unsigned numbers_counter = 0;

while(fscanf(f,"%i",&array[numbers_counter++])==1){
    if(numbers_counter>=sizeof(array)){
        if((array = (int*) realloc(array,sizeof(int)*sizeof(int)*10)) == NULL)
            exit(1);
    }
}

В этом сегменте я выделяю пространство размером 10 int в памяти, тогда, когда массив заполнен (if(numbers_counter>=sizeof(array))), массив для большего набора чисел. Если у вас есть до 10 номеров, он занимает только 10 * 4 байта, от 11 до 100 он занимает 100 * 4, et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...