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库是C++编程中的一个强大工具集,它提供了一系列高质量的、经过广泛测试的库,旨在...
例如,引入`#include <boost/iostreams/device/file.hpp>`来使用Boost.IOStreams库。 Boost库提供了许多强大的功能模块,包括但不限于: - **Boost.Thread**:提供了多线程编程接口,如线程、互斥量、条件变量等。...
1. **Boost库概述**:Boost库由一系列独立的模块组成,涵盖了并发性、泛型编程、算法、数据结构、数学运算、元编程等多个方面。这些模块为C++程序员提供了丰富的工具,能够提高代码的效率、可读性和可维护性。 2. *...
Boost的I/O库如`boost::iostreams`为文件、网络等I/O操作提供了高级抽象。它不仅支持标准I/O流,还允许对数据进行过滤、压缩等处理,极大地扩展了C++的I/O功能。 #### 杂项 除了上述主要领域外,Boost还涵盖了其他...
离线安装包,亲测可用
- **库的特点**:Boost库的所有组成部分都是以源代码形式提供的,并且遵循了一个非常宽松的开源许可证(Boost Software License)。这意味着开发者可以自由地在任何项目中使用这些库,无论是商业项目还是非商业项目...
例如,`boost::iostreams`库提供了一种统一的方式来处理不同类型的输入输出设备,而`boost::filesystem`则提供了一套跨平台的文件系统API。 #### 杂项 这部分涵盖了Boost库中其他各种有用的工具和技术,比如线程...
gzipStream.push(boost::iostreams::gzip_compressor()); gzipStream.push(out); // 将输入文件的内容复制到压缩流 boost::iostreams::copy(in, gzipStream); gzipStream.reset(); // 清除过滤器 in.close...
Boost库提供了更高级别的抽象,例如`boost::iostreams::file_descriptor_source`和`boost::iostreams::file_descriptor_sink`。这种方式增强了错误处理和跨平台兼容性。例如: ```cpp #include <boost/iostreams/...
汉化 boost 文档,致力 boost 推广。 如果你对本项目有兴趣,欢迎加入,相关说明请查阅项目论坛: https://groups.google.com/ 到目前为止,各人贡献的译文如下: 贡献者 贡献的译文 alai04 accumulators, any, ...
离线安装包,亲测可用
matlab 2016a 由于找不到 boost_iostreams-vc120-mt-1_56.dll,无法继续执行代码。重新安装程序可能会解决此问题。
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.x86_64.rpm
在Chapter2 IOStreams的课程中,我们将深入探讨如何利用流进行基本的文件输入输出操作,以及它作为面向对象编程的引入部分。本章分为以下几个部分: 1. **流与基本文件I/O** - 流是一种字符的流动,可以是输入流或...
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:Boost程序库开发的94个秘笈》是一本专为开发者准备的指南,涵盖了Boost库的广泛知识,旨在帮助程序员充分利用这个强大的C++工具集。Boost库是C++社区的一个重要贡献,它包含了一系列经过严格测试、...
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...