2017-04-30 1 views
1

배열을 사용하지 않고 빠른 정렬로 파일 번호를 정렬하려고합니다. 그러나 특정 위치의 번호를 다른 위치로 대체 할 수있는 방법을 모르겠습니다.C의 파일에서 숫자 정렬

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

}

, 그것은 가능하다하십시오 이 코드를 만들어 시작 했어?

+2

먼저 데이터를 메모리에로드하고 다음으로 정렬해야합니다. – Crack81

+1

아니, 아니, 아니! 파일의 데이터를 정렬하려면 먼저 메모리로 읽은 다음 정렬하십시오. 평소 스왑을 ftell/fseek mumbo-jumbo로 바꾸는 것은 미친 일입니다. –

+2

모든 텍스트 값의 자릿수가 같지 않으면 작동하지 않습니다. 어쨌든'ftell'은 방금 읽은 번호의 파일 위치를 알려주지 않습니다. 파일 포인터는 끝 문자를 가리 키도록 향상되었습니다 - 다음 숫자도 아닙니다! –

답변

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; 
} 
+0

간단한 'while (1)'루프로 충분할 때 왜 'goto loop'를 사용 했습니까? 다른 'goto'를 사용하는 대신 정렬 할 수 있습니다. –

+0

개인 취향; 무한 루프와 end-of-program 작업/정리를 위해'goto'를 사용하는 것을 선호합니다. –