Как сохранить позицию потока при использовании gzstream с gzipped-файлом?

Мне приходится иметь дело с большими файлами, сжатыми с помощью gzipped. Мне нужно получить доступ к подмножеству строк, не обязательно в порядке. Таким образом, я подумывал пройти через весь файл один раз во время записи позиции потока в интересующих вас линиях. И затем, чтобы использовать эти позиции потоков, чтобы быстро получить нужную мне информацию.

Для этого я использую 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 filters вместо? Любой фрагмент кода был бы весьма признателен;)

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, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest