在我的代码中,我有两种类型的编写器:常规编写器,类Writer
和压缩编写器,类ZlibWriter
。我需要一种结合两个作家的方法
请看下面的代码。对不起,这有点太长了。我试着发布非常相关的内容。
typedef std::vector<int> int_vector;
class Writer
{
public:
void open(string path);
void close();
void write(string v);
void write(bool v);
void write(int v);
void write(int_vector v);
private:
std::ofstream m_fstream; ///< file output stream
};
class ZlibWriter
{
public:
void open();
void close();
void write(int v);
void write(int_vector v);
private:
ozstream m_zstream; ///< ozstream is a wrapper class that extends ofstream and compress data using zlib format prior to writing
};
class Storage
{
public:
string m_name;
bool m_compressed;
int_vector m_data;
};
class StorageWriter
{
public:
void init(string path)
{
m_writer.open(path)
}
void write(const Storage& p)
{
m_writer.write(p.m_name);
m_writer.write(p.m_compressed);
if( !p.m_compressed )
m_writer.write(p.m_data);
else
{
// TBD - how to use ZlibWriter here?
}
}
private:
Writer m_writer;
};
的约束
StorageWriter::write()
是我的计划的瓶颈。它被称为无数次,并负责写入许多千兆字节的数据。
的问题
我需要在//TBD
中实施StorageWriter::write().
部分
我想在Writer
和ZlibWriter
之间进行“切换”的简单方法。
建议1
不要使用ZlibWriter
。每次我需要压缩数据时,只需将其压缩为临时变量,然后将其写入文件即可
我不喜欢这个,因为它会让我复制已在类ZlibWriter
中实现的整个压缩机制。
建议2
ZlibWriter
的实例(或甚至作为StorageWriter
的成员)。 ZlibWriter
流移至位置等级Writer
的位置。ZlibWriter
。Writer
的位置移至文件末尾。 不确定将两个直播流发送到同一个文件是明智的。此外,所有这些寻求操作在该计划的关键部分都不是非常有效。
非常感谢你的时间。
答案 0 :(得分:1)
您可以重载ZlibWriter
ctor,这样您就可以提供作者写入的自定义流。使用std::ostream::rdbuf
将输出缓冲区替换为另一个流的输出缓冲区。
答案 1 :(得分:0)
我不确定你在寻找什么(你总是写一个文件,或者每个作者都写自己的文件?)但是将两个作者都作为成员变量完全没问题。 你甚至可以拥有一个写作者的向量。所以创建一个所有编写器都包含的抽象接口,以便您可以遍历向量并简单地使用您的数据调用write()函数。编写器本身将处理写入,因此zlib编写器将压缩数据然后编写它,而不必担心任何事情:)
如果你需要在它们之间切换,你可以为你的zlibwriter添加一个单独的成员变量,在else的情况下用zlibwriter写下压缩的数据。
加速进程的一个想法是在编写器之间共享文件,因为一次只有一个进程会写入它,如果你将文件移到编写器之外,并给两个编写者一个引用它,你可以处理来自编写者的搜索等,这意味着下一个编写者可以只写,而不必进行不必要的文件操作。