2

boost::iostreams を使用して、.gz ファイルを読み取り、テキスト コンテンツを画面に出力しようとしています。これは、このライブラリについて学ぶための簡単な実験であり、IMDb (ftp://ftp.fu-berlin.de/pub/misc/movies/database/) の「directors.list.gz」ファイルを次のように使用しています。私の入力ファイル。

私のコードは MSVC-10 経由でコンパイルされますが、実行時にプロセスが中止されます。エラー コードが R6010 であることを除いて、エラー メッセージから得られる情報はあまりありません。

これを引き起こした原因と、これを機能させるにはどうすればよいかについて、誰かが私に指示してもらえますか?

このライブラリはかなりきれいに見え、正しく使用したいと思っています。助けてくれてどうもありがとう。

#include <fstream>                 // isalpha
#include <iostream>                // EOF
#include <boost/iostreams/categories.hpp> // input_filter_tag
#include <boost/iostreams/operations.hpp> // get
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/filter/zlib.hpp>


using namespace std;
namespace io = boost::iostreams;


int main() 
{

    if(true)
    {

        string infile_path = "c:\\Temp\\directors.list.gz";
        ifstream infile(infile_path, ios_base::in | ios_base::binary);
        io::filtering_streambuf<io::input> in; //filter
        in.push(io::zlib_decompressor());       
        in.push(infile); 

        //output to cout
        io::copy(in, cout);
    }

    return 0;
}
4

1 に答える 1

1

gzipファイル形式には、zlibが読み取ることができないzlibデータの周りに追加のヘッダーがあります。

したがって、zlib_decompressorの代わりにboostのgzip_decompressorを使用する必要があります。

in.push(gzip_decompressor());

boost / iostreams / filter/zlib.hの代わりにboost/iostreams / filter/gzip.hを含める必要があることに注意してください。

GZIPファイルをストリーミングする実際の例を次に示します。

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/copy.hpp>

using namespace boost::iostreams;

int main()
{
    std::ifstream file("hello.gz", std::ios_base::in | std::ios_base::binary);
    filtering_streambuf < input > in;
    in.push(gzip_decompressor());
    in.push(file);
    boost::iostreams::copy(in, std::cout);
}

特定のboost::iostreamsフィルターの詳細については、boostのドキュメントを参照してください:http ://www.boost.org/doc/libs/1_46_1/libs/iostreams/doc/quick_reference.html#filters

また、コードがgccでコンパイルされなかったことも指摘しておく必要があります。C++標準ライブラリでは、ifstreamコンストラクターはstd::stringではなくconstchar *を取ります。(Microsoftのバージョンについてはわかりません)。

于 2012-06-03T00:46:48.390 に答える