/*

    这是一个示例程序,使用了Dlib库的compress_stream和cmd_line_parser组件。

    这个示例实现了一个简单实用的命令行压缩程序。

    当使用-h选项时候,程序输出如下:

        使用: compress_stream_ex (-c|-d|-l) --in input_file --out output_file
选项:
-c 表示要执行压缩文件操作.
-d 表示要执行解压文件操作.
--in <arg> 此选项带一个参数,指定要压缩或解压的文件名称.
--out <arg> 此选项带一个参数,指定输出文件名称. 其他选项:
-h 显示帮助信息.
-l <arg> 设置压缩级别[1-3], 3是最大压缩,默认值是2. */ #include <dlib/compress_stream.h>
#include <dlib/cmd_line_parser.h>
#include <iostream>
#include <fstream>
#include <string> // 为要使用的compress_stream版本做一个typedef定义
typedef dlib::compress_stream::kernel_1da cs1;
typedef dlib::compress_stream::kernel_1ea cs2;
typedef dlib::compress_stream::kernel_1ec cs3; using namespace std;
using namespace dlib; int main(int argc, char** argv)
{
try
{
command_line_parser parser; // 首先,定义需要的命令行参数
// 添加 -c 选项,并给出描述信息
parser.add_option("c","表示要执行压缩文件操作.");
parser.add_option("d","表示要执行解压文件操作.");
// 添加需带一个参数的选项 --in
parser.add_option("in","此选项带一个参数,指定要压缩或解压的文件名称.",1);
// 添加需带一个参数的选项 --in
parser.add_option("out","此选项带一个参数,指定输出文件名称.",1); // 在下面代码中,使用parser.print_options()方法在屏幕上打印所有选项.
// 在添加这些选项之前,我们可以调用 set_group_name()将一些选项分组在一起。
// 通常,可以通过调用set_group_name()来创建多个分组。这里我们仅创建一个。
parser.set_group_name("其他选项");
parser.add_option("h","显示帮助信息.");
parser.add_option("l","设置压缩级别[1-3], 3是最大压缩,默认值是2.",1); // 现在,将解析命令行参数
parser.parse(argc,argv); // 现在,将使用parser(解析器)去验证命令行参数.
// 如果一下任意检验失败,将抛出异常。该异常包含一条消息,告诉错误原因. // 首先,需要检查一下,没有提供任何选项的命令行。
// 这需要定义一个数组,其中包含不应该多次出现的选项,然后调用check_one_time_options()
const char* one_time_opts[] = {"c", "d", "in", "out", "h", "l"};
parser.check_one_time_options(one_time_opts);
// 下面,检查用户是否同时提供 -c 和 -d 选项
parser.check_incompatible_options("c", "d"); // 下面检查 -l 选项,其参数应是1到3范围内的整数
// 也就是说,它可以通过dlib::string_assign转换到1、2或3。请注意,如果是要范围是1.0到3.0的
// 浮点数,则可以给出范围1.0到3.0。或者向check_option_arg_range()函数的template参数显示
// 提供一个float或double类型.
parser.check_option_arg_range("l", 1, 3); // 'l'选项是'c'选项的子选项。也就是说只能在压缩的时候选择压缩级别。
// 下面命令检查列出的子选项给出的时候,父选项是否存在。
const char* c_sub_opts[] = {"l"};
parser.check_sub_options("c", c_sub_opts); // 检查命令行中是否给出了-h选项
if (parser.option("h"))
{
// 显示所有命令行选项
cout << "使用: compress_stream_ex (-c|-d|-l) --in input_file --out output_file\n";
// 此函数打印出一个格式很好的列表,来展示parser具有所有选项
parser.print_options();
return 0;
} // 获取压缩级别选项值,如果没有则使用默认的2
int compression_level = get_option(parser,"l",2); // 确保提供了c或d两个选项之一
if (!parser.option("c") && !parser.option("d"))
{
cout << "命令行错误:\n 你必须指定 -c 或 -d 选项.\n";
cout << "\n使用 -h 选项查看更多信息." << endl;
return 0;
} string in_file;
string out_file; // 检查用户是否给出了输入文件名
// 如果是,在获取给定的文件名
if (parser.option("in"))
{
in_file = parser.option("in").argument();
}
else
{
cout << "命令行错误:\n 你必须指定一个输入文件.\n";
cout << "\n使用 -h 选项查看更多信息." << endl;
return 0;
} // 检查用户是否给出了输入文件名
// 如果是,在获取给定的文件名
if (parser.option("out"))
{
out_file = parser.option("out").argument();
}
else
{
cout << "命令行错误:\n 你必须指定一个输出文件.\n";
cout << "\n使用 -h 选项查看更多信息." << endl;
return 0;
} // 打开我们将要读取和写入的文件
ifstream fin(in_file.c_str(),ios::binary);
ofstream fout(out_file.c_str(),ios::binary); // 确保文件打开正确
if (!fin)
{
cout << "打开文件 " << in_file << " 出错.\n";
return 0;
} if (!fout)
{
cout << "创建文件 " << out_file << " 出错.\n";
return 0;
} // 现在执行实际的压缩或解压缩
if (parser.option("c"))
{
// 将压缩级别保存到输出文件
serialize(compression_level, fout); switch (compression_level)
{
case 1:
{
cs1 compressor;
compressor.compress(fin,fout);
}break;
case 2:
{
cs2 compressor;
compressor.compress(fin,fout);
}break;
case 3:
{
cs3 compressor;
compressor.compress(fin,fout);
}break;
}
}
else
{
// 从输入文件获取压缩级别
deserialize(compression_level, fin); switch (compression_level)
{
case 1:
{
cs1 compressor;
compressor.decompress(fin,fout);
}break;
case 2:
{
cs2 compressor;
compressor.decompress(fin,fout);
}break;
case 3:
{
cs3 compressor;
compressor.decompress(fin,fout);
}break;
default:
{
cout << "压缩文件有错误,无效的压缩级别。" << endl;
}break;
}
} }
catch (exception& e)
{
// 请注意,这将捕获所有cmd_line_parse_error异常并打印默认消息。
cout << e.what() << endl;
}
}

DLib压缩解压程序示例的更多相关文章

  1. 基于哈夫曼编码的压缩解压程序(C 语言)

    这个程序是研一上学期的课程大作业.当时,跨专业的我只有一点 C 语言和数据结构基础,为此,我查阅了不少资料,再加上自己的思考和分析,实现后不断调试.测试和完善,耗时一周左右,在 2012/11/19 ...

  2. 7z 压缩解压简单示例

    7z命令行压缩示例: 7z -tZip a test.zip ./test/* -mx0 把test文件夹中所有文件以存储压缩的模式压缩成zip格式的文件,压缩文件为test.zip a为添加选项   ...

  3. linux下安装压缩解压程序7z命令及7z命令的使用

    1.1 在线安装如果你的宿主机Linux可以连接外网,推荐用这种方式,方便简单,执行命令:sudo apt-get install p7zip即可在线安装7z命令. 1.2 安装包安装7z(准确点说是 ...

  4. (转载)C#压缩解压zip 文件

    转载之: C#压缩解压zip 文件 - 大气象 - 博客园http://www.cnblogs.com/greatverve/archive/2011/12/27/csharp-zip.html C# ...

  5. 使用C#压缩解压rar和zip格式文件

    为了便于文件在网络中的传输和保存,通常将文件进行压缩操作,常用的压缩格式有rar.zip和7z,本文将介绍在C#中如何对这几种类型的文件进行压缩和解压,并提供一些在C#中解压缩文件的开源库. 在C#. ...

  6. SAPCAR 压缩解压软件的使用方法

    SAPCAR 是 SAP 公司使用的压缩解压软件,从 SAP 网站下载的补丁包和小型软件基本都是扩展名为 car 或 sar 的,它们都可以用 SAPCAR 来解压.下面是它的使用说明: 用法: 创建 ...

  7. linux驱动系列之文件压缩解压小节(转)

    转至网页:http://www.jb51.net/LINUXjishu/43356.html Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通 ...

  8. Linux的压缩解压命令快速上手——解压篇

    在Linux系统中,压缩文件通常是先将若干文件(包括目录)打包成一个tar文件,然后再调用压缩程序将tar文件压缩成相应的压缩包,这也就是为什么Linux系的压缩包的后缀通常都是像tar.gz,tar ...

  9. huffman压缩解压文件【代码】

    距离上次写完哈夫曼编码已经过去一周了,这一周都在写huffman压缩解压,哎,在很多小错误上浪费了很多时间调bug.其实这个程序的最关键部分不是我自己想的,而是借鉴了某位园友的代码,但是,无论如何,自 ...

随机推荐

  1. 说说初用 Mock 工具测试碰到的坑

    我是一个在校实习生,作为一个程序猿,是个菜鸟中战斗机!对于测试,只写过一点点简单到不能再简单了的 Junit 单元测试的例子(因为当时这足以应付学校课程的内容与要求).这几天在公司里要真枪实弹做测试的 ...

  2. [转]Nginx+mysql+php-fpm负载均衡配置实例

    转 : http://www.jbxue.com/article/7923.html 介绍一个nginx.mysql.php-fpm环境下配置负载均衡的例子,有需要的朋友,可以参考下. 系统环境如下: ...

  3. 利用Bootstrap+Avalonjs+EntityFramework 开发ASP.NET WebForm应用程序(上)

    本文将介绍如何利用Bootstrap+Avalonjs+EntityFramework 开发ASP.NET WebForm应用程序,分为上下两篇.上篇主要介绍实现,下篇主要介绍界面. 打开Visual ...

  4. Spring框架中IoC(控制反转)的原理(转)

    原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...

  5. 数据库实例: STOREBOOK > 用户 > 编辑 用户: SYSTEM

    ylbtech-Oracle:数据库实例: STOREBOOK  >  用户  >  编辑 用户: SYSTEM 编辑 用户: SYSTEM 1. 一般信息返回顶部 1.1, 1.2, 2 ...

  6. 第三十二章 elk(3)- broker架构 + 引入logback

    实际中最好用的日志框架是logback,我们现在会直接使用logback通过tcp协议向logstash-shipper输入日志数据.在上一节的基础上修改!!! 一.代码 1.pom.xml < ...

  7. go语言之进阶篇定时器Timer的使用

    1.Timer的使用 示例: #创建一个定时器,设置时间为2s,2s后,往time通道写内容(当前时间) package main import ( "fmt" "tim ...

  8. [leetcode]Palindrome Partitioning @ Python

    原题地址:https://oj.leetcode.com/problems/palindrome-partitioning/ 题意: Given a string s, partition s suc ...

  9. Xamarin/Mono IOS Limitations

    http://developer.xamarin.com/guides/ios/advanced_topics/limitations/ Since applications on the iPhon ...

  10. HDU 4059 The Boss on Mars(容斥原理 + 四次方求和)

    传送门 The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...