`
zj5121
  • 浏览: 4203 次
  • 性别: Icon_minigender_1
  • 来自: 渥村
最近访客 更多访客>>
社区版块
存档分类
最新评论

Use boost::iostreams::pipe

阅读更多

Following code implements the same function as "tar cf - workspace |gzip -9 -c >1.tar.gz"

performance is also good.

#include <boost/iostreams/device/file.hpp>
#include <iostream>
#include <string>
#include <boost/iostreams/pipeline.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>

using namespace std;

namespace io = boost::iostreams;

int main(int argc, char** argv)
{
	using namespace io::gzip;

	if (argc<2) {
		cout<<"Usage: "<<argv[0]<<" <dir>"<<endl;
		return -1;
	}
	//io::file_descriptor_source src(fileno(pf));
	io::filtering_ostream out;
	io::gzip_params gp(9);
	out.push(io::gzip_compressor(gp));
	out.push(io::file_sink("1.tar.gz"));

	string cmd = "tar cf - ";
	cmd += argv[1];
	FILE* pf = popen(cmd.c_str(),"r");
	if (pf != NULL) {
		char buf[8192];
		size_t r;
		//fflush(pf);
		while(!feof(pf)&&!ferror(pf)&&
			(r=fread(buf, 1, sizeof(buf)-1, pf))>0) {
			//cout << "read :"<<r<<endl;
			out.write(buf, r);
		}
		if (ferror(pf))
		{
			perror("\nerror:");
			pclose(pf);
			return -1;
		}
		
		pclose(pf);
	}
	return 0;
}

 $ time mytargz workspace/

real    0m0.704s
user    0m0.668s
sys    0m0.036s


$ time (tar cf - workspace |gzip -9 -c >1.tar.gz )

real    0m0.744s
user    0m0.728s
sys    0m0.020s

 

Another method is to use io::copy(in,out,bufsize), which just short the coding, looks no performance benifit.

const io::file_descriptor_source src(fileno(pf));
io::stream<io::file_descriptor_source > is(src);
io::copy(is, out, 8192);
 
分享到:
评论

相关推荐

    深入实践Boost:Boost程序库开发的94个秘笈

    《深入实践Boost:Boost程序库开发的94个秘笈》是一本专为软件开发者设计的指南,旨在帮助读者深入理解和充分利用Boost库。Boost库是C++编程中的一个强大工具集,它提供了一系列高质量的、经过广泛测试的库,旨在...

    boost库1.68版本windows下编译的dll和lib库

    例如,引入`#include &lt;boost/iostreams/device/file.hpp&gt;`来使用Boost.IOStreams库。 Boost库提供了许多强大的功能模块,包括但不限于: - **Boost.Thread**:提供了多线程编程接口,如线程、互斥量、条件变量等。...

    Boost程序库完全开发指南

    1. **Boost库概述**:Boost库由一系列独立的模块组成,涵盖了并发性、泛型编程、算法、数据结构、数学运算、元编程等多个方面。这些模块为C++程序员提供了丰富的工具,能够提高代码的效率、可读性和可维护性。 2. *...

    C++标准库Boost程序库导论

    Boost的I/O库如`boost::iostreams`为文件、网络等I/O操作提供了高级抽象。它不仅支持标准I/O流,还允许对数据进行过滤、压缩等处理,极大地扩展了C++的I/O功能。 #### 杂项 除了上述主要领域外,Boost还涵盖了其他...

    boost-iostreams-1.53.0-28.el7.i686.rpm

    离线安装包,亲测可用

    Boost库学习指南 Boost库学习指南

    - **库的特点**:Boost库的所有组成部分都是以源代码形式提供的,并且遵循了一个非常宽松的开源许可证(Boost Software License)。这意味着开发者可以自由地在任何项目中使用这些库,无论是商业项目还是非商业项目...

    boost程序库导论

    例如,`boost::iostreams`库提供了一种统一的方式来处理不同类型的输入输出设备,而`boost::filesystem`则提供了一套跨平台的文件系统API。 #### 杂项 这部分涵盖了Boost库中其他各种有用的工具和技术,比如线程...

    压缩解压数据 dll

    gzipStream.push(boost::iostreams::gzip_compressor()); gzipStream.push(out); // 将输入文件的内容复制到压缩流 boost::iostreams::copy(in, gzipStream); gzipStream.reset(); // 清除过滤器 in.close...

    VC++ 文件不同方式读写

    Boost库提供了更高级别的抽象,例如`boost::iostreams::file_descriptor_source`和`boost::iostreams::file_descriptor_sink`。这种方式增强了错误处理和跨平台兼容性。例如: ```cpp #include &lt;boost/iostreams/...

    boost 1.41 中文文档,使用帮助,教程手册

    汉化 boost 文档,致力 boost 推广。 如果你对本项目有兴趣,欢迎加入,相关说明请查阅项目论坛: https://groups.google.com/ 到目前为止,各人贡献的译文如下: 贡献者 贡献的译文 alai04 accumulators, any, ...

    boost-iostreams-1.53.0-28.el7.x86_64.rpm

    离线安装包,亲测可用

    boost_iostreams-vc120-mt-1_56.dll

    matlab 2016a 由于找不到 boost_iostreams-vc120-mt-1_56.dll,无法继续执行代码。重新安装程序可能会解决此问题。

    boost-iostreams-1.41.0-11.el6_1.2.i686.rpm

    boost-iostreams-1.41.0-11.el6_1.2.i686.rpm是centos工具包。

    boost159-iostreams-1.59.0-2.el7.1.x86_64.rpm

    boost159-iostreams-1.59.0-2.el7.1.x86_64.rpm

    boost159-iostreams-1.59.0-2.el7.x86_64.rpm

    boost159-iostreams-1.59.0-2.el7.x86_64.rpm

    C程序设计教学课件:Chapter2IOStreams.pptx

    在Chapter2 IOStreams的课程中,我们将深入探讨如何利用流进行基本的文件输入输出操作,以及它作为面向对象编程的引入部分。本章分为以下几个部分: 1. **流与基本文件I/O** - 流是一种字符的流动,可以是输入流或...

    qt5.2.0编译boost库文件

    win32:LIBS += -L$$quote(C:\Boost\install\lib) -lboost_thread-mt -lboost_system-mt -lboost_date_time-mt -lboost_regex-mt -lboost_iostreams-mt ``` 这里我们使用了动态链接库(`-l`前缀后跟库名),`-L`选项...

    boost程序库开发的94个秘笈

    《深入实践Boost:Boost程序库开发的94个秘笈》是一本专为开发者准备的指南,涵盖了Boost库的广泛知识,旨在帮助程序员充分利用这个强大的C++工具集。Boost库是C++社区的一个重要贡献,它包含了一系列经过严格测试、...

    matlab所依赖的boost_*****.dll文件文件打包.zip

    6. boost_unit_test_framework-vc120-mt-1_56.dll:Boost的单元测试框架,用于测试MATLAB的代码模块。 7. boost_log-vc120-mt-1_56.dll:日志记录核心库,与日志系统紧密关联。 8. boost_program_options-vc120-mt-1...

Global site tag (gtag.js) - Google Analytics