2016-12-04 90 views
0

16進数のファイルをランレングスコードに圧縮するプログラムを作成しています。たとえば、ファイル与えられた:私が書いたプログラムが立ち往生なぜ私にはわからないC言語でファイルをランレングスコードに圧縮するプログラム

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

46 6f 6f 20 62 61 72 21 21 21 20 20 20 20 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

これは、ほとんどの場合圧縮の優れた方法ではありません。入力の長い部分が繰り返している場合にのみうまく動作します。繰り返しがない場合、ファイルは実際には2倍になります。入力が 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つ以上を圧縮するだけの価値があります。他のすべての文字は、エスケープ文字自体を除いてそのまま使用されます。

関連する問題