在 C 中将文件压缩为 运行 长度代码的程序

program to compress a fileinto run-length code in 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.");
    }
}

编辑:我更新了删除 !feof(file) 参数的代码,并将其替换为实际的 I/O 函数。感谢您的洞察力。但是,我的程序还是不行。

我不知道为什么你的程序 "gets stuck" 但这可能会更好。请注意,我已经丢弃了无意义的 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 的更好方法是选择一个 "escape" 值来定义何时进行压缩。因此 3 个值将编码一个压缩序列,因此只值得压缩 3 个或更多相同的值。所有其他字符都是逐字的,除了转义字符本身。