如何在Linux上用C++将数据导入bzip2并从其stdout获取结果数据?

4

我正在考虑为Linux开发一个库,为应用程序开发人员提供虚拟文件系统,其中文件存储在存档中,存档中的每个文件都会被单独压缩,以便对于开发人员、CPU和硬盘来说,检索单个文件是非常简单的任务。(没有复杂的API,无需解压大量数据,只需相关的数据,并且只检索相关数据而不是整个存档)

我之前在Linux上使用C++使用popen检索过命令的stdout,但我不知道如何将数据管道传输并获取数据,并且一些bzip2特定的提示会很好。多年前,我写过类似于这样的东西,但它包括一个作为dll的霍夫曼压缩库,而不是必须使用标准工具进行数据管道传输。(那是在我使用Windows的时候。)


Boost iostreams 有一个很好的概念叫做“过滤器”;你可以创建一个 iostream,然后只需将 bzip2 过滤器添加到它上面。看看吧,至少结果看起来非常整洁。 - Kerrek SB
@KerrekSB 听起来相当强烈,我得记住这个,以备将来的项目。 - coder543
2个回答

4
bzip2有一个库接口--这可能比调用子进程更容易。
我建议您还要查看GIO库,它已经是一个专为应用程序开发者设计的“虚拟文件系统”,将其扩展以实现您想要的功能,可能比从头开始编写一个VFS库要少很多工作。

谢谢!我会研究一下,我计划按照自己的方式编写这段代码的主要原因只是为了进行头脑锻炼。这个项目的范围不包括如何压缩东西,所以我想重用bzip2,但VFS和API...这些才是这个项目中有趣的部分。现在,让我们看看我能从这个bzip2库接口中找到什么。 - coder543

2

请查看Boost IOStreams

以下是我从命令行创建的示例文件:

$ echo "this is the first line" > file
$ echo "this is the second line" >> file
$ echo "this is the third line" >> file
$ bzip2 file 
$ file file.bz2 
file.bz2: bzip2 compressed data, block size = 900k

我随后使用了boost::iostreams::filtering_istream来读取解压缩后名为file.bz2的文件的结果。

#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filter/bzip2.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <iostream>

namespace io = boost::iostreams;

/* To Compile:
g++ -Wall -o ./bzipIOStream ./bzipIOStream.cpp -lboost_iostreams
*/

int main(){

    io::filtering_istream in;
    in.push(io::bzip2_decompressor());
    in.push(io::file_source("./file.bz2"));

    while(in.good()){
        char c = in.get();
        if(in.good()){
            std::cout << c;
        }
    }

    return 0;
}

运行该命令的结果是解压缩的数据。
$ ./bzipIOStream 
this is the first line
this is the second line
this is the third line

你当然不需要逐个字符地读取数据,但我试图让例子保持简单易懂。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接