从C中的文件中排序数字

时间:2017-04-30 18:33:20

标签: c sorting

我想在不使用数组的情况下快速排序文件编号。但是,我不知道如何用另一个替换特定位置的数字。 我开始制作这段代码:

int main()
{  

FILE* F1=fopen("file.txt","r+");
  int var1, var2, min;

while(fscanf(F1, "%d", &var1) ==1){
                min = var1;
                long pos1 = ftell(F1);
                fseek(F1, 0, SEEK_SET);
        while(fscanf(F1, "%d", &var2) ==1){
            if(min > var2)
            {
               //Replace the var2 by min in the file

            }

        }
        fseek(F1, pos1, SEEK_SET);
}

}

请,有可能吗?

1 个答案:

答案 0 :(得分:2)

没有使用数组就没有合理的方法。这就是我要做的事情:

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

#ifndef ENOENT
#define ENOENT 2
#endif

static int comp(const void *a, const void *b)
{
        const int va = *(const int *)a;
        const int vb = *(const int *)b;

        return va > vb ? 1 : va == vb ? 0 : -1;
}

int main(int argc, char **argv)
{
        enum {PAGE_SIZE = 4096, INTS_PER_PAGE = PAGE_SIZE / sizeof(int)};

        int *arr = (int *)malloc(PAGE_SIZE);
        int *beg = arr;
        int *end = arr;
        size_t arr_size = 0;
        size_t max_arr_size = INTS_PER_PAGE;
        FILE *f;

        if (arr == NULL) {
                perror("malloc(3)");
                return errno;
        }

        if (argc < 2) {
                fprintf(stderr, "%s\nusage: kwiksort input_file\n",
                        strerror(ENOENT));
                return ENOENT;
        }

        f = fopen(argv[1], "r+");

        if (f == NULL) {
                perror("fopen(3)");
                return errno;
        }

loop:
        for (; arr_size < max_arr_size; ++arr_size, ++end)
                if (fscanf(f, "%d", end) == EOF)
                        goto sort;

        max_arr_size += INTS_PER_PAGE;
        arr = (int *)realloc(arr, max_arr_size * sizeof(int));

        if (arr == NULL) {
                perror("realloc(3)");
                return errno;
        }

        beg = arr;
        end = arr + arr_size;

        goto loop;

sort:
        qsort(arr, arr_size, sizeof(int), comp);

        rewind(f);

        while (beg < end)
                fprintf(f, "%d\n", *beg++);

        fclose(f);
        free(arr);

        return 0;
}