我的装载机看起来像这样:
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。
而且我没有一个线索女巫类来扩展以及实现它的实现功能。
我不需要寻求。只需简单的线性读数和一些基本的错误检查。
甚至不需要完整的标头支持,数据文件是自己制作的。
答案 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有
必要的支持。)