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関数に置き換えました。洞察に感謝します。しかし、私のプログラムはまだ動作しません。
大きな出力をどのように「圧縮」と見なすことができますか? –
[while(!feof(fp))は常に間違っています](https://stackoverflow.com/questions/5431941) – user3386109
これは、ほとんどの場合圧縮の優れた方法ではありません。入力の長い部分が繰り返している場合にのみうまく動作します。繰り返しがない場合、ファイルは実際には2倍になります。入力が 6f 6f 6f 6f 6f 6f 01 01 01 01 の場合、出力は 06 6f 04 01 であり、ファイルが元のサイズの40%に縮小されます。効果は入力に依存します。 –