我正在尝试读取.gz文件并使用boost :: iostreams在屏幕上打印文本内容。这只是一个简单的实验来了解这个库,我正在使用IMDb的“directors.list.gz”文件(ftp://ftp.fu-berlin.de/pub/misc/movies/database/)我的输入文件。
我的代码通过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;
}
答案 0 :(得分: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 。 (我不确定微软的版本)。