我必须处理用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易于使用和修改,因此我倾向于坚持使用。