我有一个读取少数类型文件的界面。界面具有read
和open
方法(以及更多)。 open
收到文件名(const char *)并打开文件进行读取。目前我支持两种文件类型,pcap和raw binary。最近我发现我想要读取的所有文件实际上是压缩的(以gzip格式),但除此之外所有文件保持不变(在解压缩文件后,一切按设计工作)。我想添加open方法解压缩功能,因此首先将文件解压缩(在内存中,不将解压缩的内容写入磁盘)并将解压缩的内容传递给实际的实现。主要问题是open
实现需要文件名,在pcap的情况下,open
实现调用pcap_open_offline
没有接收流或缓冲区。理想情况下,我可以创建某种文件(管道,链接或其他),并将其与我从压缩文件中提取的内容相关联。不知道怎么办呢?这里有一些代码可以让我更容易理解我在做什么
class FileReader //interface
{
public:
void open(const char* name)
{
// unzip file here
open_impl(name);
}
virtual size_t read() = 0;
protected:
virtual void open_impl(const char* name) = 0;
};
class PcapReader: public FileReader
{
public:
size_t read() {...}
protected:
virtual void open_impl(const char* name)
{
pcap_open_offline(name, error_buffer);
}
char error_buffer[1024];
};