gpt4 book ai didi

c++ - 实现部分写入压缩数据的存储编写器

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:59 25 4
gpt4 key购买 nike

在我的代码中,我有两种类型的编写器:常规编写器,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() 是我程序的瓶颈。它被调用了无数次,并负责写入数 GB 的数据。

问题
我需要在 StorageWriter::write().
中实现 //TBD 部分我想要一种在 WriterZlibWriter 之间“切换”的简单方法。

建议一
不要使用 ZlibWriter。每次需要压缩数据时,只需将其压缩到临时变量,然后将其写入文件即可。
我不喜欢这样,因为它会让我复制已经在 ZlibWriter 类中实现的整个压缩机制。

建议2

  1. 动态创建类 ZlibWriter 的实例(或者甚至作为 StorageWriter 的成员)。
  2. ZlibWriter 流的位置移动到类 Writer 的位置。
  3. 使用ZlibWriter写入数据。
  4. Writer 的位置移动到文件末尾。

不确定将两个实时流传输到同一个文件是否明智。此外,所有这些寻道操作在程序的关键部分都不是很有效。



非常感谢您的宝贵时间。

最佳答案

您可以重载您的 ZlibWriter 构造函数,这样您就可以提供您的编写器将写入的自定义流。使用 std::ostream::rdbuf 将您的输出缓冲区替换为另一个流的输出缓冲区。

关于c++ - 实现部分写入压缩数据的存储编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20678909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com