如何将二进制数据写入压缩文件 我有一些财务数据,我正在用C++处理。我将它存储在一个简单的二进制格式中,因为它需要更少的资源和更快的速度,但是我想给文件添加压缩。我猜我会受到IO的限制,所以压缩在处理速度方面不会花费我太多
我不知道如何做压缩,因为我是一个学者,而不是一个真正的程序员。我真的需要一些人手来抓这个如何将二进制数据写入压缩文件 我有一些财务数据,我正在用C++处理。我将它存储在一个简单的二进制格式中,因为它需要更少的资源和更快的速度,但是我想给文件添加压缩。我猜我会受到IO的限制,所以压缩在处理速度方面不会花费我太多,c++,zlib,data-compression,bzip2,boost-iostreams,C++,Zlib,Data Compression,Bzip2,Boost Iostreams,我不知道如何做压缩,因为我是一个学者,而不是一个真正的程序员。我真的需要一些人手来抓这个 I have my data in a structure like this: struct TradesBin { int ttim; int prc; int siz; short int g127; short int corr; char cond[2]; char ex[1]; }__attribute__((packed)); 我
I have my data in a structure like this:
struct TradesBin {
int ttim;
int prc;
int siz;
short int g127;
short int corr;
char cond[2];
char ex[1];
}__attribute__((packed));
我可以将其写入二进制文件,如下所示:
ofstream fout(outfile.c_str(), ios::out | ios::binary);
fout.write((char *) &tbin, sizeof(TradesBin));
其中tbin由TradesBin数据填充
现在如何向这些文件添加压缩?我只模糊地听说过ZLO、Bzip2、zlib和Boost.IOStreams之类的东西。非常感谢您的指导和建议
谢谢大家! Zlib允许您这样做,但它只提供一个普通的C接口。简言之,你知道
gzFile fp = gzopen(fname.c_str(),"wb");
gzwrite(fp, (void*) (&vec[0]), sizeof(TradesBin)*nelem);
gzclose(fp);
例如,
vec
将是std::vector
,用于您的TradesBin
结构。Zlib是您想要使用的,但不幸的是,使用它有点棘手,因为它是以一种协同方式运行的。当然,更简单的是编写平面文件,然后压缩它们。Boost允许你在正常的C++流的顶部使用ZLIB。但是,您确定需要压缩吗?还有所有…@HotLicks:不需要合作。就在最近,我处理过这样的代码,用于(大量)简单的数字数据,在这些数据中,我们读/写成串的双精度数据。如果您遇到困难,Zlib几乎适用于任何地方。如果空间如此重要,您可能希望“反汇编”结构,只写入每个数据的原始字节;而不是具有构建的字节打包风格的结构。无论如何,这样做是一个好主意,逐字逐句,以确保在不同平台(例如,big和little endian)上的读取是无缝的和完全可移植的。@Dirkeddebuettel——我说的是“一种协同程序方式”——你必须将数据输入穷人的队列,而不是逻辑块中。谢谢你的回答。我几乎实现了你的方法。然而,我得到一个编译错误,声明“没有合适的从std::vector到“voidpc”的转换。有什么建议吗?是的,碰巧我也必须这样做。更新答案…请随意投票并接受:)