c语言实现rle算法,C语言课程设计---RLE压缩算法
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压缩算法相关推荐
- 代写python期末作业价格_代写program留学生作业、代做Python程序语言作业、代写Python课程设计作业...
代写program留学生作业.代做Python程序语言作业.代写Python课程设计作业 日期:2019-11-29 12:55 Completing the Final Project - Pyth ...
- 2015520吴思其 基于《Arm试验箱的国密算法应用》课程设计个人报告
20155200吴思其 基于<Arm试验箱的国密算法应用>课程设计个人报告 课程设计中承担的任务 完成试验箱测试功能4,5,6以及SM3加密实验的实现 测试四 GPIO0按键中断实验 实验 ...
- 20155234 昝昕明《基于ARM实验箱的国密算法应用》课程设计个人报告
20155234 昝昕明<基于ARM实验箱的国密算法应用>课程设计个人报告 个人贡献 参与课设题目讨论及完成全过程: 资料收集: SM1算法及和ARM之间通信 负责串口代码调试: 协调完成 ...
- 使用C语言编写DTMF检测程序,DSP课程设计---DTMF信号的产生及检测.doc
DSP课程设计---DTMF信号的产生及检测 DSP课程设计 实 验 报 告 DTMF信号的产生及检测 院(系): 电子信息工程学院通信工程专业 设计人员:宋佳阳 学号目录 一.设计任务书- 3 - ...
- c语言版碟片出借系统代码,课程设计要用用C语言编写的图书管管理系统
课程设计要用用C语言编写的图书管管理系统 高手们帮帮忙发到: 990705217@http://doc.xuehai.net 谢谢啦-- 要求如下 2011-6-20 09:14 提问者:青石灬小巷 ...
- c语言音像店程序,音像店管理程序_C 课程设计.pdf
课 程 设 计 报 告 课程名称 C 语言课程设计 课题名称 音像店管理程序 专 业 信息安全 班 级 信安1501 学 号 1151290113 姓 名 李浩东 指导教师 姜力争 2016 年 1 ...
- 函数c语言桶排算法,C语言基本排序算法之桶式排序实例
本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以 ...
- C语言数码管节日灯,硬件课程设计报告可编程节日彩灯(C语言).pdf
中国矿业大学计算机学院 2015级本科生课程报告 课程名称 硬件课程设计 C 设计题目 节日彩灯 (语言) 报告时间 2018-1-13 学生姓名 学 号 专 业 任课教师 目录 1 绪论 1 1.1 ...
- c语言关键字中英翻译机课程设计,课程设计--C语言关键字中英翻译机.doc
课程设计--C语言关键字中英翻译机 课 程 设 计 报 告 学院.系:吉林大学珠海学院计算机科学与技术系专业名称:计算机科学与技术课程设计科目C语言程序课程设计所在班级:4班学生学号:学生姓名:曾伟雄 ...
最新文章
- Android内存泄漏就这样产生了
- 【剑指offer-Java版】08旋转数组的最小数字
- 用 Flask 来写个轻博客 (18) — 使用工厂模式来生成应用对象
- Qt Designer 编辑Tab顺序
- IE8下 Select文字垂直居中的办法
- Java黑皮书课后题第7章:**7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串。编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串
- linux 网络编程学习
- php实现金币提现,PHP实现微信提现功能
- matlab界area_Matlab的数据科学界
- 2021 年 Linux 界的 12 件大事
- 《利用python进行数据分析》读书笔记--第十章 时间序列(一)
- 最短路径 | 1087 三重标尺+记录最短路径条数
- 洛谷 1297 [国家集训队]单选错位——期望
- 华为机试——整理数字字符串
- 一对多关联关系映射和设置级联属性
- Oracle导出表数据客户端,使用PLSQL批量导出、导入表的数据(精简版的Oracle客户端亦可)...
- 安鸾渗透实战平台--综合渗透--企业网站渗透流程
- POJ 2242 The Circumference of the Circle G++ 海伦公式 三角形外接圆半径公式 背
- 任意文件包含漏洞原理解析及演示
- OSChina 周二乱弹 —— 代码中的坑是怎么出现的?
热门文章
- 考研预报名显示服务器错误,2021考研预报名常见问题:考研预报名入口无法打开怎么办?...
- 必做作业2:屏幕截取录制及编辑 软件调研
- Redis cache-aside模型-分布式锁等问题研究
- 站点的监控小工具-监控宝
- PYTHON+UDP+双向通信
- java毕业设计人人小说系统mybatis+源码+调试部署+系统+数据库+lw
- 历史最全量化交易书籍、视频教程、博客、代码、算法整理
- 绝地求生服务器维护4月9日,绝地求生4月9日停机维护到什么时候 4.9吃鸡更新维护公告...
- 关于2023中国(济南)国际换热传热技术与应用展览会通知
- Linux如何查看防火墙是否开放了某端口