Как мне передать данные в bzip2 и получить полученные данные из его стандартного вывода в C ++ в Linux? - PullRequest
4 голосов
/ 16 ноября 2011

Я подумываю начать работу над библиотекой для Linux, которая предоставит разработчикам приложений виртуальную файловую систему, в которой файлы будут храниться в архиве, а каждый файл в архиве будет сжат по отдельности, чтобы можно было извлечь один файл. это очень простая задача для разработчика, для процессора и жесткого диска. (Нет сложного API, нет необходимости распаковывать гигабайты данных, только релевантные данные и извлекать только релевантные данные, а не весь архив)

Я использовал popen, чтобы получить стандартный вывод команды, прежде чем использовать C ++ здесь, в Linux, но я не знаю, как передавать и выводить данные, и некоторые конкретные советы по bzip2 были бы хорошими. Я написал нечто похожее на это несколько лет назад, но оно включало библиотеку сжатия Хаффмана в виде DLL, вместо того, чтобы передавать данные и использовать стандартный инструмент. (это было в мои дни Windows.)

Ответы [ 2 ]

4 голосов
/ 16 ноября 2011

bzip2 имеет интерфейс библиотеки - это, вероятно, будет проще, чем вызов подпроцесса.

Я рекомендую вам также взглянуть на библиотеку GIO , которая уже является «виртуальной файловой системой для разработчиков приложений»;это может быть гораздо меньше работы, чтобы расширить это, чтобы делать то, что вы хотите, чем написать библиотеку VFS с нуля.

2 голосов
/ 16 ноября 2011

Посмотрите на 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

Затем я использовал повышение ::iostreams :: filtering_istream для чтения результатов распакованного файла bzip2 с именем 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;
}

Результатом выполнения команды являются распакованные данные.Конечно, я не читал данные по символам, но я старался, чтобы пример был простым.

...