C语言课程设计---RLE压缩算法

RLE算法的介绍

RLE全称(run-length encoding),翻译为游程编码,又译行程长度编码,又称变动长度编码法(run coding),在控制论中对于二值图像而言是一种编码方法,对连续的黑、白像素数(游程)以不同的码字进行编码。游程编码是一种简单的非破坏性资料压缩法,其好处是加压缩和解压缩都非常快。其方法是计算连续出现的资料长度压缩之。

如图为RLE算法描述

RLE在用于二进制多重复的情况下比较好, 特点是可以做到无损压缩, 但是用于字符多且重复性差的情况下可能做到事倍功半, 比如 ABCDEFG经压缩后将成为1A1B1C1D1E1F1G, 字符串整整扩大了一倍.

c语言实现

为了模拟出有重复性的数据, 我以如下方式进行数据生成:

#include

using namespace std;

int main(){

freopen("file.txt","w",stdout);//输出重定向,输出到文件

srand(time(0));//以当前时间作为种子

char x;

for(int i = 0; i <= 10000000; ++i){

x = 'a' + rand()%26;

cout<

}

return 0;

}

RLE算法代码:

编写一个程序,可以在命令行输入参数,完成指定文件的压缩解压

命令行参数如下

rle file1 –c(-d) file2

第一个参数为可执行程序名称,第二个参数为原始文件名,第三个参数为压缩或解压缩选项,第四个参数为新文件名

#include

using namespace std;

void zip(char* filename,char *outfile){

FILE *in, *out;

int filelen;

char cur, tmp;

if(!(in = fopen(filename,"rb")))

cout<

else

{

out = fopen(outfile,"wb");

cur = fgetc(in);

tmp = cur;

filelen = 1;

while(!feof(in)){

cur = fgetc(in);

if(cur == tmp){

filelen++;

}

else{

fputc(filelen+'0',out);

fputc(tmp,out);

tmp = cur;

filelen = 1;

}

}

}

fclose(in);

fclose(out);

}

void unzip(char *filename,char *outfile){

FILE *in, *out;

int filelen;

char cur;//光标

if(!(in = fopen(filename,"rb")))

cout<

else

{

out = fopen(outfile,"wb");

while(!feof(in)){

filelen = fgetc(in)-'0';

if(feof(in))break;//feof的问题,折腾了好一会,不好表述,总之在feof应当在每一次读操作之后判断是否到文件末, 不然会造成多读一次的错误

cur = fgetc(in);

while(filelen--)

fputc(cur,out);

}

}

fclose(in);

fclose(out);

}

int main(int argc,char *argv[]){

if(!strcmp(argv[2], "-d")){

unzip(argv[1], argv[3]);

cout<

}

else if(!strcmp(argv[2],"-c")){

zip(argv[1], argv[3]);

cout<

}

else

cout<

return 0;

}

其中应用到了两个之前没用过的函数fgetc和fputc, 这里简单记录一下:

fgetc是一种计算机C语言中的函数。意为从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。

函数格式:int fgetc(FILE *stream)

fputc函数功能: 将字符ch写到文件指针fp所指向的文件的当前写指针的位置。

函数格式:int fputc (int c, FILE *fp)

结果:

源文件----35MB

压缩后文件----15MB

c语言实现rle算法,C语言课程设计---RLE压缩算法相关推荐

  1. 代写python期末作业价格_代写program留学生作业、代做Python程序语言作业、代写Python课程设计作业...

    代写program留学生作业.代做Python程序语言作业.代写Python课程设计作业 日期:2019-11-29 12:55 Completing the Final Project - Pyth ...

  2. 2015520吴思其 基于《Arm试验箱的国密算法应用》课程设计个人报告

    20155200吴思其 基于<Arm试验箱的国密算法应用>课程设计个人报告 课程设计中承担的任务 完成试验箱测试功能4,5,6以及SM3加密实验的实现 测试四 GPIO0按键中断实验 实验 ...

  3. 20155234 昝昕明《基于ARM实验箱的国密算法应用》课程设计个人报告

    20155234 昝昕明<基于ARM实验箱的国密算法应用>课程设计个人报告 个人贡献 参与课设题目讨论及完成全过程: 资料收集: SM1算法及和ARM之间通信 负责串口代码调试: 协调完成 ...

  4. 使用C语言编写DTMF检测程序,DSP课程设计---DTMF信号的产生及检测.doc

    DSP课程设计---DTMF信号的产生及检测 DSP课程设计 实 验 报 告 DTMF信号的产生及检测 院(系): 电子信息工程学院通信工程专业 设计人员:宋佳阳 学号目录 一.设计任务书- 3 - ...

  5. c语言版碟片出借系统代码,课程设计要用用C语言编写的图书管管理系统

    课程设计要用用C语言编写的图书管管理系统 高手们帮帮忙发到: 990705217@http://doc.xuehai.net 谢谢啦-- 要求如下 2011-6-20 09:14 提问者:青石灬小巷 ...

  6. c语言音像店程序,音像店管理程序_C 课程设计.pdf

    课 程 设 计 报 告 课程名称 C 语言课程设计 课题名称 音像店管理程序 专 业 信息安全 班 级 信安1501 学 号 1151290113 姓 名 李浩东 指导教师 姜力争 2016 年 1 ...

  7. 函数c语言桶排算法,C语言基本排序算法之桶式排序实例

    本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以 ...

  8. C语言数码管节日灯,硬件课程设计报告可编程节日彩灯(C语言).pdf

    中国矿业大学计算机学院 2015级本科生课程报告 课程名称 硬件课程设计 C 设计题目 节日彩灯 (语言) 报告时间 2018-1-13 学生姓名 学 号 专 业 任课教师 目录 1 绪论 1 1.1 ...

  9. c语言关键字中英翻译机课程设计,课程设计--C语言关键字中英翻译机.doc

    课程设计--C语言关键字中英翻译机 课 程 设 计 报 告 学院.系:吉林大学珠海学院计算机科学与技术系专业名称:计算机科学与技术课程设计科目C语言程序课程设计所在班级:4班学生学号:学生姓名:曾伟雄 ...

最新文章

  1. Android内存泄漏就这样产生了
  2. 【剑指offer-Java版】08旋转数组的最小数字
  3. 用 Flask 来写个轻博客 (18) — 使用工厂模式来生成应用对象
  4. Qt Designer 编辑Tab顺序
  5. IE8下 Select文字垂直居中的办法
  6. Java黑皮书课后题第7章:**7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串。编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串
  7. linux 网络编程学习
  8. php实现金币提现,PHP实现微信提现功能
  9. matlab界area_Matlab的数据科学界
  10. 2021 年 Linux 界的 12 件大事
  11. 《利用python进行数据分析》读书笔记--第十章 时间序列(一)
  12. 最短路径 | 1087 三重标尺+记录最短路径条数
  13. 洛谷 1297 [国家集训队]单选错位——期望
  14. 华为机试——整理数字字符串
  15. 一对多关联关系映射和设置级联属性
  16. Oracle导出表数据客户端,使用PLSQL批量导出、导入表的数据(精简版的Oracle客户端亦可)...
  17. 安鸾渗透实战平台--综合渗透--企业网站渗透流程
  18. POJ 2242 The Circumference of the Circle G++ 海伦公式 三角形外接圆半径公式 背
  19. 任意文件包含漏洞原理解析及演示
  20. OSChina 周二乱弹 —— 代码中的坑是怎么出现的?

热门文章

  1. 考研预报名显示服务器错误,2021考研预报名常见问题:考研预报名入口无法打开怎么办?...
  2. 必做作业2:屏幕截取录制及编辑 软件调研
  3. Redis cache-aside模型-分布式锁等问题研究
  4. 站点的监控小工具-监控宝
  5. PYTHON+UDP+双向通信
  6. java毕业设计人人小说系统mybatis+源码+调试部署+系统+数据库+lw
  7. 历史最全量化交易书籍、视频教程、博客、代码、算法整理
  8. 绝地求生服务器维护4月9日,绝地求生4月9日停机维护到什么时候 4.9吃鸡更新维护公告...
  9. 关于2023中国(济南)国际换热传热技术与应用展览会通知
  10. Linux如何查看防火墙是否开放了某端口