我已经编写了自己的输入流缓冲区,它应该适用于 gzip 压缩文件。这是它的界面:
class gzstreambuf : public std::streambuf
{
static const int bufferSize = 8192;
public:
gzstreambuf();
~gzstreambuf();
int is_open() { return opened_; }
gzstreambuf* open(const std::string& name, int mode);
std::streampos pubseekpos(std::streampos offset, std::ios_base::openmode which = std::ios_base::in);
int underflow();
private:
void close();
private:
gzFile file;
char opened;
char buffer[bufferSize];
int mode;
std::string fileName;
};
我正在尝试编写函数,该函数将获取文件名并返回普通的streambuf,以防文件未压缩,否则返回gzstreambuf:
boost::shared_ptr<std::streambuf>
getStreamBuffer(const std::string& fileName)
{
const bool isGzippedFile = ( fileName.size() >= 3 && ".gz" == fileName.substr(fileName.size() -3));
std::ifstream is(fileName.c_str());
boost::shared_ptr<std::streambuf> strBuf;
if(! isGzippedFile)
{
strBuf.reset(is.rdbuf());
}
else
{
boost::shared_ptr<gzstreambuf> gz(new gzstreambuf);
gz->open(fileName, std::ios_base::in);
strBuf = gz;
}
return strBuf;
}
但是这个实现在非 gzip 文件的情况下不起作用,因为is
对象会在调用这个函数后被销毁。
我该如何解决这个问题?