编写一个程序,可以在命令行输入参数,完成指定文件的压缩解压 命令行参数如下 rle file1 –c(-d) file2 第一个参数为可执行程序名称,第二个参数为原始文件名,第三个参数为压缩或解压缩选项,第四个参数为新文件名
时间: 2024-02-28 07:56:31 浏览: 65
rle.rar_RLE_rle压缩_visual c
以下是使用C语言实现RLE压缩解压命令行程序的代码示例。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// RLE压缩函数
char* rle_compress(const char* data) {
int len = strlen(data);
char* result = (char*)malloc(len * 2 + 1);
int count = 1;
char ch = data[0];
int j = 0;
for (int i = 1; i < len; i++) {
if (data[i] == ch) {
count++;
} else {
result[j++] = count + '0';
result[j++] = ch;
ch = data[i];
count = 1;
}
}
result[j++] = count + '0';
result[j++] = ch;
result[j] = '\0';
return result;
}
// RLE解压函数
char* rle_decompress(const char* data) {
int len = strlen(data);
char* result = (char*)malloc(len + 1);
int j = 0;
for (int i = 0; i < len; i += 2) {
int count = data[i] - '0';
char ch = data[i + 1];
for (int k = 0; k < count; k++) {
result[j++] = ch;
}
}
result[j] = '\0';
return result;
}
int main(int argc, char* argv[]) {
if (argc != 5) {
printf("命令格式不正确!\n");
printf("rle file1 -c(-d) file2\n");
return 0;
}
const char* filename1 = argv[1];
const char* option = argv[2];
const char* filename2 = argv[4];
FILE* fp1, *fp2;
char* buffer = NULL;
int length;
fp1 = fopen(filename1, "rb");
if (fp1 == NULL) {
printf("文件 %s 打开失败!\n", filename1);
return 0;
}
fseek(fp1, 0, SEEK_END);
length = ftell(fp1);
fseek(fp1, 0, SEEK_SET);
buffer = (char*)malloc(length + 1);
fread(buffer, length, 1, fp1);
fclose(fp1);
buffer[length] = '\0';
char* result = NULL;
if (strcmp(option, "-c") == 0) {
result = rle_compress(buffer);
} else if (strcmp(option, "-d") == 0) {
result = rle_decompress(buffer);
} else {
printf("命令选项不正确!\n");
printf("选项 -c 表示压缩,选项 -d 表示解压缩。\n");
free(buffer);
return 0;
}
free(buffer);
fp2 = fopen(filename2, "wb");
if (fp2 == NULL) {
printf("文件 %s 创建失败!\n", filename2);
free(result);
return 0;
}
fwrite(result, strlen(result), 1, fp2);
fclose(fp2);
free(result);
printf("操作成功!\n");
return 0;
}
```
在命令行中输入命令 `rle file1 -c file2` 可以将文件 `file1` 压缩后保存为文件 `file2`,输入命令 `rle file1 -d file2` 可以将文件 `file1` 解压缩后保存为文件 `file2`。需要注意的是,在使用RLE压缩算法时,我们需要注意压缩后的字符串长度可能会变长,因此需要使用动态分配内存的方式来存储结果。在解压算法中,我们也需要使用动态分配内存的方式来存储解压后的字符串。
阅读全文