Hoe houd je de streampositie bij het gebruik van gzstream met gzipped-bestand?

Ik heb te maken met grote bestanden gecomprimeerd met gzipped. Ik moet een subset van de regels openen, niet noodzakelijk in de juiste volgorde. Dus zat ik te denken om alle bestanden een keer door te nemen terwijl ik de stroompositie vastlegde op de lijnen waar ik in geïnteresseerd ben. En dan, om deze stroomposities te gebruiken om snel de informatie op te halen die ik nodig heb.

Hiervoor gebruik ik gzstream . Maar helaas lijkt tellg niet te werken met deze wrapper:

#include 
#include 
using namespace std;

#include 

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;
}

Deze code geeft dit als resultaat:

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

Is er een manier om dit met igzstream te laten werken? Of moet ik Gzip-filters verbeteren gebruiken in plaats daarvan? Elk codefragment wordt zeer op prijs gesteld;)

2

1 antwoord

gzstream doesn't support seeking in a file, and this is not a particularly efficient operation in a gzipped file anyways. You can look at this question and its answer: Random access gzip stream

Een van de antwoorden geeft een link naar een voorbeeldcode van de broncode van zlib die u zou kunnen gebruiken om u te helpen bij het implementeren van de gewenste functie in gzstream. Een ander antwoord suggereert een variant gecomprimeerd formaat dat het zoeken naar efficiënter ondersteunt.

Boost iostream kan zoeken ondersteunen, maar gzstream is best een stuk eenvoudiger in gebruik en aan te passen, dus ik heb de neiging om daaraan vast te houden.

0
toegevoegd
Bedankt. Inderdaad, het antwoord dat een variabel gecomprimeerd formaat suggereert (variant maar heel dicht bij gzip) was zeer nuttig. Een meer gedetailleerd antwoord is hier beschikbaar: biostar.stackexchange.com/questions/13627/…
toegevoegd de auteur tflutre, de bron