Я пишу программу для сжатия файла, состоящего из шестнадцатеричных значений, в код длины строки. Например, данный файл:программа для сжатия кода длины файла в 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 (файл) аргумент и заменив его реальной функции ввода/вывода, а!. Спасибо за понимание. Однако моя программа все еще не работает.
Как можно более крупный выход считать «сжатием»? –
[while (! Feof (fp)) всегда неверен] (https://stackoverflow.com/questions/5431941) – user3386109
В большинстве случаев это не отличный способ сжатия; он работает только хорошо, если есть длинные части ввода, которые повторяются. Если повторения нет, файл фактически удваивается по размеру. Если входной сигнал: 6f 6f 6f 6f 6f 6f 01 01 01 01 Выход 06 6f 04 01 , который уменьшает файл до 40% от его первоначального размера. Эффективность зависит от ввода. –