Як зберегти позицію потоку при використанні gzstream з gzip-файлом?

Я маю справу з великими файлами, стиснутими gzip. Мені потрібно отримати доступ до підмножини рядків, не обов'язково в порядку. Таким чином, я думав, щоб пройти весь файл один раз під час запису потоку позиції за лініями, якими я зацікавлений. А потім, щоб використовувати позиції цих потоків, щоб швидко отримати необхідну інформацію.

Для цього я використовую gzstream . На жаль, tellg , здається, не працює з цією обгорткою:

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

Цей код повертає це:

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

Чи є спосіб зробити цю роботу з igzstream? Або я повинен використовувати Boost gzip-фільтри замість цього? Будемо дуже вдячні за будь-який фрагмент коду;)

2

1 Відповіді

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

Одна з відповідей надає посилання на прикладний код із вихідного коду zlib, який ви могли б використати, щоб допомогти вам реалізувати потрібну функцію в gzstream. Інша відповідь пропонує варіант стисливого формату, який допомагає шукати більш ефективно.

Boost iostream може підтримувати пошук, але gzstream є набагато простішим у використанні та зміні, тому я мав тенденцію дотримуватися цього.

0
додано
Дякую. Дійсно, відповідь на пропозицію варіанта стислих форматів (варіант, але дуже близький до gzip) був дуже корисним. Більш детальна відповідь доступна тут: biostar.stackexchange.com/questions/13627/…
додано Автор tflutre, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147