Мне приходится иметь дело с большими файлами, сжатыми с помощью gzipped.Мне нужно получить доступ к подмножеству строк, не обязательно по порядку.Таким образом, я подумал о том, чтобы пройти по всему файлу один раз во время записи позиции потока в интересующих меня строках. А затем использовать эти позиции потоков для быстрого получения необходимой мне информации.
Для этого,Я использую 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 ?Любой фрагмент кода будет с благодарностью;)