2016-12-04 6 views
0

16 진수 값으로 구성된 파일을 런 - 길이 코드로 압축하는 프로그램을 작성 중입니다. 예를 들어, 파일을 주어진 :C에서 파일을 런 - 길이 코드로 압축하는 프로그램

46 6f 6f 20 62 61 72 21 21 21 20 20 20 20 20 

내 코드는 다음 파일을 생성한다 :

01 46 02 6f 01 20 01 62 01 61 01 72 03 21 05 20 

내가 작성한 프로그램이 걸리면 왜 모르겠어요. 어떤 도움을 주시면 감사하겠습니다.

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

#define TRUE 1 
#define FALSE 0 

int main(void){ 
    int a, b, c, count=1, flag=TRUE; 

    FILE *file; 
    FILE *out; 

    file = fopen("input.txt", "r"); 

    if(file){ 
     out = fopen("input.txt.out", "a"); 
     fscanf(file, "%x", &a); 
     while(fscanf(file, "%x", &c)){ 
      while(flag==TRUE){ 
       if(c==a){ 
        count= count+1; 
       }else{ 
        flag = FALSE; 
       } 
       b=a; 
       a=c; 
      } 
      fprintf(out, "%d %02x ", count, b); 
      count = 1; 
      flag = TRUE; 
     } 
    }else{ 
     printf("ERROR: file not found."); 
    } 
} 

EDIT :! feof (file) 인수를 제거하고 대신 실제 I/O 함수로 바꾸는 코드를 업데이트했습니다. 통찰력에 감사드립니다. 그러나, 내 프로그램은 여전히 ​​작동하지 않습니다.

+1

큰 출력을 어떻게 "압축"으로 간주 할 수 있습니까? –

+1

[while (! feof (fp))은 항상 잘못됨] (https://stackoverflow.com/questions/5431941) – user3386109

+1

대부분의 경우 압축 방법이 좋지 않습니다. 반복되는 입력의 긴 부분이있는 경우에만 잘 작동합니다. 반복이 없으면 파일의 크기는 실제로 두 배가됩니다. 입력이 6f 6f 6f 6f 6f 6f 01 01 01 01 인 경우 출력은 06 6f 04 01 이고 파일을 원본 크기의 40 %로 줄입니다. 효과는 입력에 따라 다릅니다. –

답변

1

왜 프로그램이 "멈추는 지"는 모르겠지만 더 잘 작동 할 수 있습니다. 유의 사항 나는 무의미한 a, b, c과 진실을 버렸습니다.

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

int main(void){ 
    int lastchar, thischar, count; 

    FILE *finp; 
    FILE *fout; 
    finp = fopen("input.txt", "r"); 
    fout = fopen("output.txt", "w");    // changed "a" to "w" 
    if(fout == NULL || finp == NULL) { 
     puts("Error opening file(s)"); 
     exit(1); 
    } 

    count = 1; 
    fscanf(finp, "%x", &lastchar); 

    while(fscanf(finp, "%x", &thischar) == 1) {  // func value better then feof 
     if(thischar == lastchar) { 
      count++; 
     } 
     else { 
      fprintf(fout, "%02X %02X ", count, lastchar); 
      count = 1; 
     } 
     lastchar = thischar; 
    } 
    fprintf(fout, "%02X %02X ", count, lastchar); // discharge remaining 

    fclose(fout); 
    fclose(finp); 
    return 0; 
} 
 
Program input: 46 6f 6f 20 62 61 72 21 21 21 20 20 20 20 20 

Program output: 01 46 02 6F 01 20 01 62 01 61 01 72 03 21 05 20 

RLE를 구현하는 더 나은 방법은 압축 다음과시기를 정의하는 "탈출"값을 선택하는 것입니다. 따라서 3 개의 값은 압축 순서를 인코딩 할 것이므로 3 개 이상의 압축 만 할 가치가 있습니다. 이스케이프 문자 자체를 제외하고 다른 모든 문자는 축 어적입니다.