4

Linux用のライブラリで作業を開始することを検討しています。このライブラリは、ファイルがアーカイブに保存され、アーカイブ内の各ファイルが個別に圧縮されるため、単一のファイルの取得が非常に簡単になるように、アプリケーション開発者に仮想ファイルシステムを提供します。開発者、CPU、およびハードドライブにとっての簡単なタスク。(複雑なAPIはなく、データのギグを解凍する必要はありません。関連するデータのみを取得し、アーカイブ全体ではなく、関連するデータのみを取得します)

ここLinuxでC++を使用する前に、popenを使用してコマンドのstdoutを取得しましたが、データをパイプインおよび取得する方法がわかりません。bzip2固有のヒントがあれば便利です。私はこの数年前に似たようなものを書きましたが、データをパイプして標準ツールを使用するのではなく、dllとしてハフマン圧縮ライブラリが含まれていました。(それは私のWindowsの時代に戻った。)

4

2 に答える 2

4

bzip2にはライブラリインターフェイスがあります。これは、サブプロセスを呼び出すよりもおそらく簡単です。

すでに「アプリケーション開発者向けの仮想ファイルシステム」であるGIOライブラリもご覧になることをお勧めします。ライブラリVFSを最初から作成するよりも、それを拡張して必要な処理を実行する方がはるかに少ない作業になる可能性があります。

于 2011-11-16T01:34:03.097 に答える
2

BoostIOStreamsをご覧ください

例として、コマンドラインから次のファイルを作成しました。

$ 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という名前の削除されたbzip2ファイルの結果を読み取りました。

#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

もちろん、データを1文字ずつ読んだわけではありませんが、例を単純にしようとしていました。

于 2011-11-16T19:41:04.290 に答える