设为首页 - 加入收藏 - 网站地图 欢迎加QQ群 :14364084
当前位置:谭博的博客 > 编程语言 > c > 正文

使用boost::iostreams库压缩和解压数据

时间:2014-05-23 09:25 来源:未知 标签: 作者:谭博 阅读:

iostreams主要有两类东西组成,一个是device,另一个是filter,可以到源码目录下找,iostreams目录下有这两个目录可以找到相关类。

device像是一种设备,不能单独使用,要配合普通流stream或stream_buffer来使用,可将流中的数据输入/输出到这个设备上,可分为

Source,它以读取的方式访问字符序列,如:file_source 做文件输入。

Sink,它以写的方式访问字符序列,如:file_sink 做文件输出。

stream<file_source> 那么这个就是一个文件输入流,类似于ifilestream,而stream<file_sink>就是一个文件输出流,类似于ofilestream。

filter像一种过滤器,和device一样,也是不能单独使用的,要配合过滤流filtering_stream或filtering_streambuf来使用,将流中的数据按一种规则过滤,可分为:

InputFilter,过滤通过Source读取的输入,如:gzip_decompressor 按gzip算法解压流中的数据。
OutputFilter,过滤向Sink写入的输出,如:gzip_compressor 按gzip算法压缩流中的数据。

但filtering_stream是要维护一个filter的链表的,以device为结束。输出过滤流filtering_ostream,是按顺序执行filter,然后再输出到devic上,如:

压缩时

filtering_ostream out;
out.push(gzip_compressor()); //gzip OutputFilter

out.push(bzip2_compressor());//bzip2 OutputFilter
out.push(boost::iostreams::file_sink("test.txt"));//以file_sink device结束

这就会将流的数据先按gzip压缩,然后再按bzip2压缩之后,才输出到text.txt文件中。

 

解压时

filtering_istream in;
in.push(gzip_decompressor());/gzip InputFilter

in.push(bzip2_decompressor());/bzip2 InputFilter
in.push(file_source("test.txt"));

这时候先将test.txt文件中数据读出,然后按bzip2解压,然后再按gzip解压,存入in流中,正好是压缩的逆序。

要使用zlib压缩,首先需要通过boost编译zlib。

 

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
 
  1. 1下载zlib(http://www.zlib.net/)  
  2. 2,设置 zlib的路径(进入 dos 界面)  
  3. set  ZLIB_SOURCE=" E:/zlib-1.2.8"  
  4. 3编译  
  5. bjam --toolset=msvc-9.0 --with-iostreams --build-type=complete  
  6. 注:zlib不需要提前编译  

 

 

附实现代码

 

  1. #include <boost/iostreams/filtering_stream.hpp>  
  2. #include <boost/iostreams/copy.hpp>  
  3. #include <boost/iostreams/filter/zlib.hpp>  
  4.   
  5. #include <boost/iostreams/device/file_descriptor.hpp>  
  6. #include <boost/iostreams/device/file.hpp>  
  7.   
  8. #include <iostream>  
  9. #include <sstream>  
  10. int main()  
  11. {  
  12.     try{  
  13.           
  14.         std::stringstream ss_comp;  
  15.         boost::iostreams::filtering_ostream out;  
  16.         out.push(boost::iostreams::zlib_compressor());  
  17.         //out.push(ss_comp);    //压缩到字符流中  
  18.         out.push(boost::iostreams::file_sink("test.txt"));      //压缩到文件中  
  19.         boost::iostreams::copy(std::stringstream("hello"), out);  
  20.   
  21.         std::cout << "compressor data:" << ss_comp.str() << std::endl;  
  22.   
  23.         std::stringstream ss_decomp;  
  24.         boost::iostreams::filtering_istream in;  
  25.         in.push(boost::iostreams::zlib_decompressor());  
  26.         //in.push(ss_comp);     //从字符流中解压  
  27.         in.push(boost::iostreams::file_source("test.txt"));     //从文件中解压  
  28.         boost::iostreams::copy(in, ss_decomp);  
  29.   
  30.         std::cout << "decompressor data:" << ss_decomp.str() << std::endl;  
  31.     }  
  32.     catch(std::exception& e)  
  33.     {  
  34.         std::cout << "exception:" << e.what() << std::endl;  
  35.     }  
  36.     catch(...)  
  37.     {  
  38.         std::cout << "unknown exception." << std::endl;  
  39.     }  
  40.     system("pause");  
  41.     return 0;  
  42. }  

 

关注微信公众号

微信扫一扫,打赏我

热评文章
    内容不错,支持一下
    评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)