用C ++编写gzip压缩文件流

时间:2013-12-05 16:39:10

标签: c++ iostream

我的装载机看起来像这样:

void LispAna::loadF() {
    formatives.rehash(2991);
    std::ifstream fin("data.txt");
    formCondition st;

    std::string key;
    std::string tmp;
    int itmp;

    for (std::string row; getline(fin, row, '\n');) {
        //"a\t0\txx\tA\n"
        std::istringstream ss(row);

        getline(ss, key, '\t');

        //pos
        getline(ss, tmp, '\t');
        st.pos = *(tmp.c_str());

        //types
        getline(ss, tmp, '\t');
        st.types = tmp;

        //condition
        getline(ss, tmp, '\t');
        st.condition = tmp;

        //if(ok)?
        formatives.insert(std::pair<std::string, formCondition>(key, st));
    }
}

我想替换std::ifstream自制的zifstream。 这可以很容易地用于读取zlib压缩文本文件。

zifstream fin("data.txt.gz");
//..
for (std::string row; getline(fin, row, '\n');) {
//..
}

我有tinfl.c v1.11。 而且我没有一个线索女巫类来扩展以及实现它的实现功能。 我不需要寻求。只需简单的线性读数和一些基本的错误检查。 甚至不需要完整的标头支持,数据文件是自己制作的。

1 个答案:

答案 0 :(得分:2)

首先,我认为Boost已经拥有了你想要的东西。如果 你可以使用它,它肯定比重写更简单 自己编码。

否则:你需要定义一个过滤streambuf 进行压缩,并将压缩数据转发到 另一个streambuf(几乎肯定是以二进制打开的filebuf 模式)。只需从std::streambuf派生,并指向。{1} 你班上的最终目标streambuf。至少,你会 必须覆盖函数overflow;你可能想要 也可以覆盖xsputn

实际的zifstream非常简单:类似:

class zifstream : private std::filebuf, private zistreambuf, public std::istream
{
public:
    zifstream( std::string const& filename )
        : std::filebuf( filename.c_str(), std::ios_base::in | std::ios_base::binary )
        , zistreambuf( static_cast<std::filebuf>( this ) )
        , std::istream( static_cast<zistreambuf>( this ) )
    {
    }
};

可能就足够了。 (源自的标准类 std::istream还提供rdbuf隐藏功能的功能 一个在基类中,并返回派生类型。这是 在一些特殊情况下,更多的是“很高兴”,而不是真的 必要的。)

请注意,如果您使用"C"以外的区域设置阅读, 你必须在过滤缓冲区中进行代码转换; 在filebuf中执行它将工作。 (再一次,Boost有 必要的支持。)