Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将二进制数据写入压缩文件 我有一些财务数据,我正在用C++处理。我将它存储在一个简单的二进制格式中,因为它需要更少的资源和更快的速度,但是我想给文件添加压缩。我猜我会受到IO的限制,所以压缩在处理速度方面不会花费我太多_C++_Zlib_Data Compression_Bzip2_Boost Iostreams - Fatal编程技术网

如何将二进制数据写入压缩文件 我有一些财务数据,我正在用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”的转换。有什么建议吗?是的,碰巧我也必须这样做。更新答案…请随意投票并接受:)