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 无法读取该标头。

所以你想使用 boost 的gzip_decompressor而不是 zlib_decompressor。

in.push(gzip_decompressor());

请注意,您需要包含boost/iostreams/filter/gzip.h而不是boost/iostreams/filter/zlib.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 的文档中找到有关特定 boost::iostreams 过滤器的更多信息:http: //www.boost.org/doc/libs/1_46_1/libs/iostreams/doc/quick_reference.html#filters

我还觉得我应该指出您的代码没有使用 gcc 编译:在 C++ 标准库中,ifstream构造函数采用const char *,而不是std::string。(我不确定微软的版本)。

于 2012-06-03T00:46:48.390 回答