使用gzstream和gzip压缩文件时如何保持流的位置?

时间:2011-10-27 18:06:19

标签: c++ gzip

我必须处理用gzip压缩的大文件。我需要访问行的子集,不一定按顺序。因此,我想要在我感兴趣的行记录流位置时仔细检查所有文件。然后,使用这些流位置快速检索我需要的信息。

为此,我正在使用gzstream。但不幸的是tellg似乎无法使用此包装器:

#include <iostream>
#include <fstream>
using namespace std;

#include <gzstream.h>

int main (int argc, char ** argv)
{
  string inFile;
  string line;

  system ("rm -f infile1.txt; echo \"toto1\ntoto2\ntoto3\" > infile1.txt");
  inFile = "infile1.txt";
  ifstream inStream;
  inStream.open (inFile.c_str());
  cout << inStream.tellg () << endl;
  getline (inStream, line);
  cout << inStream.tellg () << endl;
  inStream.close ();

  system ("rm -f infile1.gz; echo \"toto1\ntoto2\ntoto3\" | gzip > infile1.gz");
  inFile = "infile1.gz";
  igzstream igzStream;
  igzStream.open (inFile.c_str());
  cout << igzStream.tellg () << endl;
  getline (igzStream, line);
  cout << igzStream.tellg () << endl;
  igzStream.close ();

  return 0;
}

此代码返回:

$ gcc -Wall test.cpp -lstdc++ -lgzstream -lz
$ ./a.out
0
6
18446744073709551615
18446744073709551615

有没有办法让这个工作与igzstream一起使用?或者我应该使用Boost gzip filters代替?任何代码片段都将非常感谢;)

1 个答案:

答案 0 :(得分:0)

gzstream不支持在文件中搜索,这在gzip文件中不是特别有效的操作。您可以查看此问题及其答案:Random access gzip stream

其中一个答案提供了一个zlib源代码示例代码的链接,您可以使用它来帮助您在gzstream中实现所需的功能。另一个答案表明,变体压缩格式确实支持更有效的搜索。

Boost iostream可能支持搜索,但gzstream使用和修改起来要容易得多,所以我倾向于坚持使用。