在 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 个或更多相同的值。所有其他字符都是逐字的,除了转义字符本身。
我正在编写一个程序,将一个由十六进制值组成的文件压缩成 运行 长度的代码。例如,给定一个文件:
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 个或更多相同的值。所有其他字符都是逐字的,除了转义字符本身。