我必须处理用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?任何代码片段将不胜感激;)

最佳答案

gzstream不支持在文件中查找,并且无论如何这在gzipped文件中并不是特别有效的操作。您可以查看此问题及其答案:Random access gzip stream

答案之一提供了zlib源代码中示例代码的链接,您可以使用该示例代码来帮助您实现gzstream中所需的功能。另一个答案提出了一种变体压缩格式,该格式确实支持更有效的查找。

Boost iostream可能支持搜索,但是gzstream易于使用和修改,因此我倾向于坚持使用。

10-08 04:47