Как сохранить позицию потока при использовании gzstream с файлом gzipped? - PullRequest
2 голосов
/ 27 октября 2011

Мне приходится иметь дело с большими файлами, сжатыми с помощью 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 ?Любой фрагмент кода будет с благодарностью;)

1 Ответ

0 голосов
/ 02 декабря 2011

gzstream не поддерживает поиск в файле, и в любом случае это не особенно эффективная операция в файле gzipped.Вы можете посмотреть на этот вопрос и его ответ: Поток gzip с произвольным доступом

В одном из ответов дается ссылка на пример кода из исходного кода zlib, который вы могли бы использовать, чтобы помочь вам реализоватьфункция, которую вы хотите в gzstream.В другом ответе предлагается вариант сжатого формата, который поддерживает поиск более эффективно.

Повышение iostream может поддерживать поиск, но gzstream намного проще в использовании и изменении, поэтому я склонен придерживаться этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...