c - 在 C 中对文件中的数字进行排序

标签 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);
}

请问,这可能吗?

最佳答案

不使用数组就没有合理的方法。这是我会做的:

#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;
}

关于c - 在 C 中对文件中的数字进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43709929/

相关文章:

java - java程序每周工作时间

c - 以递减顺序在链表中插入节点 - C

c - long long 计算的问题

c - malloc.c :2451: sYSMALLOc Assertion failed in C

c - fgets 什么时候停止读取一行?

c - 在 intel edison 上使用 C 开发 BLE 外设

c++ - OpenGL:我可以将 glBindBuffer 与 glBindBufferARB 混合使用吗?

python - 已排序的字典列表

c++ - 使用三数比较器排序

C 用双向链表交换